@salesforce/templates 66.13.4 → 66.13.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 (236) hide show
  1. package/lib/generators/baseGenerator.d.ts +2 -0
  2. package/lib/generators/baseGenerator.js +353 -0
  3. package/lib/generators/baseGenerator.js.map +1 -1
  4. package/lib/index.d.ts +1 -0
  5. package/lib/index.js +3 -1
  6. package/lib/index.js.map +1 -1
  7. package/lib/templates/project/angularextapp/CHANGELOG.md +258 -0
  8. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +1 -1
  9. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint-plugin-angular-graphql.js +148 -0
  10. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +9 -1
  11. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +421 -394
  12. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +2 -2
  13. package/lib/templates/project/angularextapp/package.json +1 -1
  14. package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +17 -0
  15. package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +33 -3
  16. package/lib/templates/project/angularextapp/scripts/org-setup.mjs +535 -3
  17. package/lib/templates/project/angularintapp/CHANGELOG.md +266 -0
  18. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +1 -1
  19. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint-plugin-angular-graphql.js +148 -0
  20. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +9 -1
  21. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +431 -404
  22. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +2 -2
  23. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +6 -1
  24. package/lib/templates/project/angularintapp/package.json +1 -1
  25. package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +17 -0
  26. package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +33 -3
  27. package/lib/templates/project/angularintapp/scripts/org-setup.mjs +535 -3
  28. package/lib/templates/project/reactexternalapp/CHANGELOG.md +1313 -0
  29. package/lib/templates/project/reactexternalapp/PRD.md +38 -0
  30. package/lib/templates/project/reactexternalapp/README.md +14 -10
  31. package/lib/templates/project/reactexternalapp/_p_/_m_/_ps_/reactexternalapp_Guest_User_Api_Access.permissionset-meta.xml +25 -0
  32. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +660 -692
  33. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package.json +9 -7
  34. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/scripts/get-graphql-schema.mjs +8 -5
  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/api/distinctValuesService.ts +84 -0
  38. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/searchService.ts +71 -0
  39. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.tsx +277 -0
  40. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/Search.tsx +185 -0
  41. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.tsx +77 -0
  42. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.tsx +182 -0
  43. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/PaginationControls.tsx +185 -0
  44. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/ScopeSelector.tsx +55 -0
  45. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SearchBar.tsx +55 -0
  46. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SortControl.tsx +62 -0
  47. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/ActiveFilters.tsx +61 -0
  48. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.tsx +125 -0
  49. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_/components → search/components/filters}/FilterContext.tsx +7 -20
  50. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/BooleanFilter.tsx +50 -0
  51. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/DateRangeFilter.tsx +160 -0
  52. 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
  53. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/MultiSelectFilter.tsx +89 -0
  54. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/NumericRangeFilter.tsx +108 -0
  55. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/SelectFilter.tsx +46 -0
  56. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/TextFilter.tsx +52 -0
  57. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/DefaultResultRow.tsx +109 -0
  58. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/config.json +83 -0
  59. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_ → search}/hooks/useAsyncData.ts +3 -10
  60. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useDistinctValues.ts +59 -0
  61. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useSearch.ts +703 -0
  62. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/index.ts +90 -0
  63. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/loadConfig.ts +14 -0
  64. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/queryBuilder.ts +156 -0
  65. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/types.ts +307 -0
  66. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/debounce.ts +17 -0
  67. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/fieldUtils.ts +14 -0
  68. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +285 -0
  69. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/sortUtils.ts +34 -0
  70. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/graphqlClient.ts +24 -8
  71. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/appLayout.tsx +7 -0
  72. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/CustomerWebClientChat.tsx +74 -0
  73. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/components → components}/ObjectBreadcrumb.tsx +7 -2
  74. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +1 -1
  75. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +2 -2
  76. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/table.tsx +9 -2
  77. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/index.ts +6 -0
  78. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx +49 -16
  79. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/AccountSearch.tsx +21 -293
  80. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/Home.tsx +22 -7
  81. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/TestChatPage.tsx +26 -0
  82. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/routes.tsx +11 -5
  83. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/types/chat.ts +36 -0
  84. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/utils/fieldUtils.ts → utils/accountFields.ts} +9 -0
  85. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/tsconfig.json +2 -2
  86. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -0
  87. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig.cls +133 -0
  88. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig.cls-meta.xml +5 -0
  89. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig_Test.cls +101 -0
  90. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig_Test.cls-meta.xml +5 -0
  91. package/lib/templates/project/reactexternalapp/_p_/_m_/package.xml +4 -0
  92. package/lib/templates/project/reactexternalapp/package.json +8 -2
  93. package/lib/templates/project/reactexternalapp/scripts/org-setup-config-schema.mjs +120 -0
  94. package/lib/templates/project/reactexternalapp/scripts/org-setup-dev.mjs +87 -0
  95. package/lib/templates/project/reactexternalapp/scripts/org-setup-utils.mjs +569 -0
  96. package/lib/templates/project/reactexternalapp/scripts/org-setup-xml.mjs +182 -0
  97. package/lib/templates/project/reactexternalapp/scripts/org-setup.config.json +6 -2
  98. package/lib/templates/project/reactexternalapp/scripts/org-setup.mjs +1509 -328
  99. package/lib/templates/project/reactexternalapp/scripts/validate-org-setup-config.mjs +38 -0
  100. package/lib/templates/project/reactinternalapp/CHANGELOG.md +1127 -0
  101. package/lib/templates/project/reactinternalapp/PRD.md +35 -0
  102. package/lib/templates/project/reactinternalapp/README.md +14 -10
  103. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +509 -505
  104. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package.json +9 -8
  105. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/distinctValuesService.ts +84 -0
  106. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/searchService.ts +71 -0
  107. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.tsx +277 -0
  108. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/Search.tsx +185 -0
  109. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.tsx +77 -0
  110. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.tsx +182 -0
  111. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/PaginationControls.tsx +185 -0
  112. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/ScopeSelector.tsx +55 -0
  113. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SearchBar.tsx +55 -0
  114. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SortControl.tsx +62 -0
  115. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/ActiveFilters.tsx +61 -0
  116. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.tsx +125 -0
  117. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_/components → search/components/filters}/FilterContext.tsx +7 -20
  118. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/BooleanFilter.tsx +50 -0
  119. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/DateRangeFilter.tsx +160 -0
  120. 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
  121. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/MultiSelectFilter.tsx +89 -0
  122. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/NumericRangeFilter.tsx +108 -0
  123. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/SelectFilter.tsx +46 -0
  124. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/TextFilter.tsx +52 -0
  125. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/DefaultResultRow.tsx +109 -0
  126. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/config.json +83 -0
  127. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_ → search}/hooks/useAsyncData.ts +3 -10
  128. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useDistinctValues.ts +59 -0
  129. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useSearch.ts +703 -0
  130. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/index.ts +90 -0
  131. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/loadConfig.ts +14 -0
  132. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/queryBuilder.ts +156 -0
  133. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/types.ts +307 -0
  134. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/debounce.ts +17 -0
  135. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/fieldUtils.ts +14 -0
  136. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +285 -0
  137. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/sortUtils.ts +34 -0
  138. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/AgentforceConversationClient.tsx +16 -132
  139. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/components → components}/ObjectBreadcrumb.tsx +7 -2
  140. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +1 -1
  141. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +2 -2
  142. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ui/table.tsx +9 -2
  143. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx +49 -16
  144. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountSearch.tsx +21 -293
  145. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/Home.tsx +21 -6
  146. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/routes.tsx +4 -4
  147. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/utils/fieldUtils.ts → utils/accountFields.ts} +9 -0
  148. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/tsconfig.json +2 -2
  149. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -0
  150. package/lib/templates/project/reactinternalapp/package.json +4 -2
  151. package/lib/templates/project/reactinternalapp/scripts/org-setup-config-schema.mjs +24 -0
  152. package/lib/templates/project/reactinternalapp/scripts/org-setup-dev.mjs +87 -0
  153. package/lib/templates/project/reactinternalapp/scripts/org-setup-utils.mjs +569 -0
  154. package/lib/templates/project/reactinternalapp/scripts/org-setup-xml.mjs +182 -0
  155. package/lib/templates/project/reactinternalapp/scripts/org-setup.mjs +1162 -214
  156. package/lib/templates/uiBundles/angularbasic/angular.json +1 -1
  157. package/lib/templates/uiBundles/angularbasic/eslint-plugin-angular-graphql.js +148 -0
  158. package/lib/templates/uiBundles/angularbasic/eslint.config.js +9 -1
  159. package/lib/templates/uiBundles/angularbasic/package-lock.json +421 -394
  160. package/lib/templates/uiBundles/angularbasic/package.json +2 -2
  161. package/lib/templates/uiBundles/reactbasic/package-lock.json +445 -418
  162. package/lib/utils/template-placeholders.js +7 -0
  163. package/lib/utils/template-placeholders.js.map +1 -1
  164. package/lib/utils/uiBundleTemplateUtils.d.ts +3 -1
  165. package/lib/utils/uiBundleTemplateUtils.js +4 -1
  166. package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
  167. package/package.json +7 -7
  168. package/lib/templates/project/reactexternalapp/AGENT.md +0 -252
  169. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/accountSearchService.ts +0 -46
  170. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountIndustries.graphql +0 -19
  171. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountTypes.graphql +0 -19
  172. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/getAccountDetail.graphql +0 -121
  173. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/searchAccounts.graphql +0 -51
  174. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountObjectDetailPage.tsx +0 -355
  175. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountSearch.tsx +0 -304
  176. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/Home.tsx +0 -34
  177. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +0 -82
  178. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +0 -89
  179. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +0 -109
  180. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +0 -41
  181. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +0 -143
  182. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +0 -78
  183. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +0 -128
  184. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +0 -70
  185. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +0 -97
  186. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +0 -167
  187. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +0 -52
  188. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +0 -97
  189. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +0 -93
  190. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useDebouncedCallback.ts +0 -34
  191. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +0 -254
  192. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +0 -25
  193. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +0 -404
  194. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +0 -38
  195. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/accountSearchService.ts +0 -46
  196. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountIndustries.graphql +0 -19
  197. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountTypes.graphql +0 -19
  198. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/query/searchAccounts.graphql +0 -51
  199. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +0 -11260
  200. package/lib/templates/project/reactexternalapp/scripts/prepare-import-unique-fields.js +0 -122
  201. package/lib/templates/project/reactinternalapp/AGENT.md +0 -252
  202. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/accountSearchService.ts +0 -46
  203. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountIndustries.graphql +0 -19
  204. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountTypes.graphql +0 -19
  205. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/getAccountDetail.graphql +0 -121
  206. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/searchAccounts.graphql +0 -51
  207. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountObjectDetailPage.tsx +0 -355
  208. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountSearch.tsx +0 -304
  209. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/Home.tsx +0 -34
  210. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +0 -82
  211. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +0 -89
  212. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +0 -109
  213. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +0 -41
  214. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +0 -143
  215. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +0 -78
  216. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +0 -128
  217. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +0 -70
  218. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +0 -97
  219. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +0 -167
  220. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +0 -52
  221. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +0 -97
  222. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +0 -93
  223. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useDebouncedCallback.ts +0 -34
  224. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +0 -254
  225. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +0 -25
  226. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +0 -404
  227. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +0 -38
  228. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/accountSearchService.ts +0 -46
  229. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountIndustries.graphql +0 -19
  230. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountTypes.graphql +0 -19
  231. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/searchAccounts.graphql +0 -51
  232. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +0 -11260
  233. package/lib/templates/project/reactinternalapp/scripts/prepare-import-unique-fields.js +0 -122
  234. /package/lib/templates/project/angularextapp/_p_/_m_/{permissionsets → _ps_}/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +0 -0
  235. /package/lib/templates/project/angularintapp/_p_/_m_/{permissionsets → _ps_}/angularintapp_Access.permissionset-meta.xml +0 -0
  236. /package/lib/templates/project/reactinternalapp/_p_/_m_/{permissionsets → _ps_}/reactinternalapp_Access.permissionset-meta.xml +0 -0
@@ -1,82 +0,0 @@
1
- import { createDataSDK } from "@salesforce/platform-sdk";
2
-
3
- export interface ObjectSearchOptions<TWhere, TOrderBy> {
4
- where?: TWhere;
5
- orderBy?: TOrderBy;
6
- first?: number;
7
- after?: string;
8
- }
9
-
10
- export type PicklistOption = { value: string; label: string };
11
-
12
- /**
13
- * Executes a GraphQL search query and extracts the result for the given object name
14
- * from the standard `uiapi.query.<ObjectName>` response shape.
15
- */
16
- export async function searchObjects<TResult, TQuery, TVariables>(
17
- query: string,
18
- objectName: string,
19
- options: ObjectSearchOptions<unknown, unknown> = {},
20
- ): Promise<TResult> {
21
- const { where, orderBy, first = 20, after } = options;
22
-
23
- const data = await createDataSDK();
24
- const variables = { first, after, where, orderBy } as TVariables;
25
- const result = await data.graphql!.query<TQuery, TVariables>({
26
- query: query,
27
- variables: variables,
28
- });
29
-
30
- if (result.errors?.length) {
31
- throw new Error(result.errors.map((e) => e.message).join("; "));
32
- }
33
-
34
- const uiapi = (result.data as Record<string, unknown> | undefined)?.uiapi as
35
- | Record<string, unknown>
36
- | undefined;
37
- const queryResult = (uiapi?.query as Record<string, unknown> | undefined)?.[objectName] as
38
- | TResult
39
- | undefined;
40
-
41
- if (!queryResult) {
42
- throw new Error(`No ${objectName} data returned`);
43
- }
44
-
45
- return queryResult;
46
- }
47
-
48
- /**
49
- * Executes a GraphQL aggregate/groupBy query and extracts picklist options
50
- * from the standard `uiapi.aggregate.<ObjectName>` response shape.
51
- */
52
- export async function fetchDistinctValues<TQuery>(
53
- query: string,
54
- objectName: string,
55
- fieldName: string,
56
- ): Promise<PicklistOption[]> {
57
- const data = await createDataSDK();
58
- const result = await data.graphql!.query<TQuery>({ query: query });
59
-
60
- if (result.errors?.length) {
61
- throw new Error(result.errors.map((e) => e.message).join("; "));
62
- }
63
-
64
- const uiapi = (result.data as Record<string, unknown> | undefined)?.uiapi as
65
- | Record<string, unknown>
66
- | undefined;
67
- const aggregate = (uiapi?.aggregate as Record<string, unknown> | undefined)?.[objectName] as
68
- | { edges?: Array<{ node?: { aggregate?: Record<string, unknown> } }> }
69
- | undefined;
70
-
71
- const edges = aggregate?.edges ?? [];
72
- return edges
73
- .map((edge) => {
74
- const field = edge?.node?.aggregate?.[fieldName] as
75
- | { value?: string | null; displayValue?: string | null; label?: string | null }
76
- | undefined;
77
- const value = field?.value;
78
- if (!value) return null;
79
- return { value, label: field.label ?? field.displayValue ?? value };
80
- })
81
- .filter((opt): opt is PicklistOption => opt !== null);
82
- }
@@ -1,89 +0,0 @@
1
- import { X } from "lucide-react";
2
- import { Button } from "../../../components/ui/button";
3
- import { cn } from "../../../lib/utils";
4
- import type { ActiveFilterValue } from "../utils/filterUtils";
5
-
6
- function formatFilterLabel(filter: ActiveFilterValue): string {
7
- const { label, type, value, min, max } = filter;
8
-
9
- switch (type) {
10
- case "search":
11
- return `Search: ${value}`;
12
- case "text":
13
- case "picklist":
14
- return `${label}: ${value}`;
15
- case "multipicklist": {
16
- const values = value ? value.split(",") : [];
17
- if (values.length <= 2) return `${label}: ${values.join(", ")}`;
18
- return `${label}: ${values.length} selected`;
19
- }
20
- case "boolean":
21
- return `${label}: ${value === "true" ? "Yes" : "No"}`;
22
- case "numeric": {
23
- if (min && max) return `${label}: ${min} - ${max}`;
24
- if (min) return `${label}: >= ${min}`;
25
- return `${label}: <= ${max}`;
26
- }
27
- case "date": {
28
- if (min && max) return `${label}: ${min} to ${max}`;
29
- if (min) return `${label}: from ${min}`;
30
- return `${label}: until ${max}`;
31
- }
32
- default:
33
- return label;
34
- }
35
- }
36
-
37
- interface ActiveFiltersProps extends React.ComponentProps<"div"> {
38
- filters: ActiveFilterValue[];
39
- onRemove: (field: string) => void;
40
- buttonProps?: Omit<React.ComponentProps<typeof ActiveFilterButton>, "filter" | "onRemove">;
41
- }
42
-
43
- export function ActiveFilters({
44
- filters,
45
- onRemove,
46
- className,
47
- buttonProps,
48
- ...props
49
- }: ActiveFiltersProps) {
50
- if (filters.length === 0) return null;
51
-
52
- return (
53
- <div className={cn("flex flex-wrap gap-2", className)} {...props}>
54
- {filters.map((filter) => (
55
- <ActiveFilterButton
56
- key={filter.field}
57
- filter={filter}
58
- onRemove={onRemove}
59
- {...buttonProps}
60
- />
61
- ))}
62
- </div>
63
- );
64
- }
65
-
66
- interface ActiveFilterButtonProps extends React.ComponentProps<typeof Button> {
67
- filter: ActiveFilterValue;
68
- onRemove: (field: string) => void;
69
- }
70
-
71
- export function ActiveFilterButton({
72
- filter,
73
- onRemove,
74
- className,
75
- ...props
76
- }: ActiveFilterButtonProps) {
77
- return (
78
- <Button
79
- variant="outline"
80
- size="sm"
81
- className={cn("gap-1 h-7 text-xs", className)}
82
- onClick={() => onRemove(filter.field)}
83
- {...props}
84
- >
85
- {formatFilterLabel(filter)}
86
- <X className="h-3 w-3" />
87
- </Button>
88
- );
89
- }
@@ -1,109 +0,0 @@
1
- import {
2
- Pagination,
3
- PaginationContent,
4
- PaginationItem,
5
- PaginationPrevious,
6
- PaginationNext,
7
- } from "../../../components/ui/pagination";
8
- import {
9
- Select,
10
- SelectContent,
11
- SelectItem,
12
- SelectTrigger,
13
- SelectValue,
14
- } from "../../../components/ui/select";
15
- import { Label } from "../../../components/ui/label";
16
-
17
- interface PaginationControlsProps {
18
- pageIndex: number;
19
- hasNextPage: boolean;
20
- hasPreviousPage: boolean;
21
- pageSize: number;
22
- pageSizeOptions: readonly number[];
23
- onNextPage: () => void;
24
- onPreviousPage: () => void;
25
- onPageSizeChange: (newPageSize: number) => void;
26
- disabled?: boolean;
27
- }
28
-
29
- export default function PaginationControls({
30
- pageIndex,
31
- hasNextPage,
32
- hasPreviousPage,
33
- pageSize,
34
- pageSizeOptions,
35
- onNextPage,
36
- onPreviousPage,
37
- onPageSizeChange,
38
- disabled = false,
39
- }: PaginationControlsProps) {
40
- const handlePageSizeChange = (newValue: string) => {
41
- const newSize = parseInt(newValue, 10);
42
- if (!isNaN(newSize) && newSize !== pageSize) {
43
- onPageSizeChange(newSize);
44
- }
45
- };
46
- const currentPage = pageIndex + 1;
47
- const prevDisabled = disabled || !hasPreviousPage;
48
- const nextDisabled = disabled || !hasNextPage;
49
-
50
- return (
51
- <div className="w-full grid grid-cols-1 sm:grid-cols-2 items-center justify-center gap-4 py-2">
52
- <div
53
- className="flex justify-center sm:justify-start items-center gap-2 shrink-0 row-2 sm:row-1"
54
- role="group"
55
- aria-label="Page size selector"
56
- >
57
- <Label htmlFor="page-size-select" className="text-sm font-normal whitespace-nowrap">
58
- Results per page:
59
- </Label>
60
- <Select
61
- value={pageSize.toString()}
62
- onValueChange={handlePageSizeChange}
63
- disabled={disabled}
64
- >
65
- <SelectTrigger
66
- id="page-size-select"
67
- className="w-16"
68
- aria-label="Select number of results per page"
69
- >
70
- <SelectValue />
71
- </SelectTrigger>
72
- <SelectContent>
73
- {pageSizeOptions.map((size) => (
74
- <SelectItem key={size} value={size.toString()}>
75
- {size}
76
- </SelectItem>
77
- ))}
78
- </SelectContent>
79
- </Select>
80
- </div>
81
- <Pagination className="w-full mx-0 sm:justify-end">
82
- <PaginationContent>
83
- <PaginationItem>
84
- <PaginationPrevious
85
- onClick={prevDisabled ? undefined : onPreviousPage}
86
- aria-disabled={prevDisabled}
87
- className={prevDisabled ? "pointer-events-none opacity-50" : "cursor-pointer"}
88
- />
89
- </PaginationItem>
90
- <PaginationItem>
91
- <span
92
- className="min-w-16 text-center text-sm text-muted-foreground px-2"
93
- aria-current="page"
94
- >
95
- Page {currentPage}
96
- </span>
97
- </PaginationItem>
98
- <PaginationItem>
99
- <PaginationNext
100
- onClick={nextDisabled ? undefined : onNextPage}
101
- aria-disabled={nextDisabled}
102
- className={nextDisabled ? "pointer-events-none opacity-50" : "cursor-pointer"}
103
- />
104
- </PaginationItem>
105
- </PaginationContent>
106
- </Pagination>
107
- </div>
108
- );
109
- }
@@ -1,41 +0,0 @@
1
- import { Search } from "lucide-react";
2
- import { Input } from "../../../components/ui/input";
3
- import { cn } from "../../../lib/utils";
4
-
5
- interface SearchBarProps extends React.ComponentProps<"div"> {
6
- value: string;
7
- handleChange: (value: string) => void;
8
- placeholder?: string;
9
- iconProps?: React.ComponentProps<typeof Search>;
10
- inputProps?: Omit<React.ComponentProps<typeof Input>, "value">;
11
- }
12
-
13
- export function SearchBar({
14
- value,
15
- handleChange,
16
- placeholder,
17
- className,
18
- iconProps,
19
- inputProps,
20
- ...props
21
- }: SearchBarProps) {
22
- return (
23
- <div className={cn("relative flex-1", className)} title={placeholder} {...props}>
24
- <Search
25
- {...iconProps}
26
- className={cn(
27
- "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground",
28
- iconProps?.className,
29
- )}
30
- />
31
- <Input
32
- type="text"
33
- value={value}
34
- onChange={(e) => handleChange(e.target.value)}
35
- placeholder={placeholder}
36
- {...inputProps}
37
- className={cn("pl-9", inputProps?.className)}
38
- />
39
- </div>
40
- );
41
- }
@@ -1,143 +0,0 @@
1
- import { ArrowUp, ArrowDown } from "lucide-react";
2
- import {
3
- Select,
4
- SelectContent,
5
- SelectItem,
6
- SelectTrigger,
7
- SelectValue,
8
- } from "../../../components/ui/select";
9
- import { Button } from "../../../components/ui/button";
10
- import { cn } from "../../../lib/utils";
11
- import type { SortFieldConfig, SortState } from "../utils/sortUtils";
12
-
13
- const NONE_VALUE = "__none__";
14
-
15
- interface SortControlProps extends React.ComponentProps<"div"> {
16
- configs: SortFieldConfig[];
17
- sort: SortState | null;
18
- onSortChange: (sort: SortState | null) => void;
19
- labelProps?: React.ComponentProps<"span">;
20
- selectProps?: Omit<
21
- React.ComponentProps<typeof SortControlSelect>,
22
- "configs" | "sort" | "onSortChange"
23
- >;
24
- directionButtonProps?: Omit<
25
- React.ComponentProps<typeof SortDirectionButton>,
26
- "sort" | "onSortChange"
27
- >;
28
- }
29
-
30
- export function SortControl({
31
- configs,
32
- sort,
33
- onSortChange,
34
- className,
35
- labelProps,
36
- selectProps,
37
- directionButtonProps,
38
- ...props
39
- }: SortControlProps) {
40
- return (
41
- <div className={cn("flex items-center gap-2", className)} {...props}>
42
- <span
43
- {...labelProps}
44
- className={cn("text-sm text-muted-foreground whitespace-nowrap", labelProps?.className)}
45
- >
46
- {labelProps?.children ?? "Sort by"}
47
- </span>
48
- <SortControlSelect
49
- configs={configs}
50
- sort={sort}
51
- onSortChange={onSortChange}
52
- {...selectProps}
53
- />
54
- {sort && (
55
- <SortDirectionButton sort={sort} onSortChange={onSortChange} {...directionButtonProps} />
56
- )}
57
- </div>
58
- );
59
- }
60
-
61
- interface SortControlSelectProps {
62
- configs: SortFieldConfig[];
63
- sort: SortState | null;
64
- onSortChange: (sort: SortState | null) => void;
65
- triggerProps?: React.ComponentProps<typeof SelectTrigger>;
66
- contentProps?: React.ComponentProps<typeof SelectContent>;
67
- selectValueProps?: React.ComponentProps<typeof SelectValue>;
68
- selectItemProps?: Omit<React.ComponentProps<typeof SelectItem>, "value">;
69
- }
70
-
71
- export function SortControlSelect({
72
- configs,
73
- sort,
74
- onSortChange,
75
- triggerProps,
76
- contentProps,
77
- selectValueProps,
78
- selectItemProps,
79
- }: SortControlSelectProps) {
80
- return (
81
- <Select
82
- value={sort?.field ?? NONE_VALUE}
83
- onValueChange={(v) => {
84
- if (v === NONE_VALUE) {
85
- onSortChange(null);
86
- } else {
87
- onSortChange({
88
- field: v,
89
- direction: sort?.direction ?? "ASC",
90
- });
91
- }
92
- }}
93
- >
94
- <SelectTrigger
95
- size="sm"
96
- {...triggerProps}
97
- className={cn("w-[160px]", triggerProps?.className)}
98
- >
99
- <SelectValue placeholder="Default" {...selectValueProps} />
100
- </SelectTrigger>
101
- <SelectContent {...contentProps}>
102
- <SelectItem value={NONE_VALUE} {...selectItemProps}>
103
- Default
104
- </SelectItem>
105
- {configs.map((c) => (
106
- <SelectItem key={c.field} value={c.field} {...selectItemProps}>
107
- {c.label}
108
- </SelectItem>
109
- ))}
110
- </SelectContent>
111
- </Select>
112
- );
113
- }
114
-
115
- interface SortDirectionButtonProps extends React.ComponentProps<typeof Button> {
116
- sort: SortState;
117
- onSortChange: (sort: SortState) => void;
118
- }
119
-
120
- export function SortDirectionButton({
121
- sort,
122
- onSortChange,
123
- className,
124
- ...props
125
- }: SortDirectionButtonProps) {
126
- return (
127
- <Button
128
- variant="ghost"
129
- size="icon-sm"
130
- className={cn(className)}
131
- onClick={() =>
132
- onSortChange({
133
- ...sort,
134
- direction: sort.direction === "ASC" ? "DESC" : "ASC",
135
- })
136
- }
137
- aria-label={`Sort ${sort.direction === "ASC" ? "descending" : "ascending"}`}
138
- {...props}
139
- >
140
- {sort.direction === "ASC" ? <ArrowUp /> : <ArrowDown />}
141
- </Button>
142
- );
143
- }
@@ -1,78 +0,0 @@
1
- import {
2
- Select,
3
- SelectContent,
4
- SelectItem,
5
- SelectTrigger,
6
- SelectValue,
7
- } from "../../../../components/ui/select";
8
- import { cn } from "../../../../lib/utils";
9
- import { useFilterField } from "../FilterContext";
10
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
11
- import type { ActiveFilterValue } from "../../utils/filterUtils";
12
-
13
- const ALL_VALUE = "__all__";
14
-
15
- interface BooleanFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
16
- field: string;
17
- label: string;
18
- helpText?: string;
19
- }
20
-
21
- export function BooleanFilter({ field, label, helpText, className, ...props }: BooleanFilterProps) {
22
- const { value, onChange } = useFilterField(field);
23
- return (
24
- <FilterFieldWrapper
25
- label={label}
26
- htmlFor={`filter-${field}`}
27
- helpText={helpText}
28
- className={className}
29
- {...props}
30
- >
31
- <BooleanFilterSelect field={field} label={label} value={value} onChange={onChange} />
32
- </FilterFieldWrapper>
33
- );
34
- }
35
-
36
- interface BooleanFilterSelectProps {
37
- field: string;
38
- label: string;
39
- value: ActiveFilterValue | undefined;
40
- onChange: (value: ActiveFilterValue | undefined) => void;
41
- triggerProps?: React.ComponentProps<typeof SelectTrigger>;
42
- contentProps?: React.ComponentProps<typeof SelectContent>;
43
- }
44
-
45
- export function BooleanFilterSelect({
46
- field,
47
- label,
48
- value,
49
- onChange,
50
- triggerProps,
51
- contentProps,
52
- }: BooleanFilterSelectProps) {
53
- return (
54
- <Select
55
- value={value?.value ?? ALL_VALUE}
56
- onValueChange={(v) => {
57
- if (v === ALL_VALUE) {
58
- onChange(undefined);
59
- } else {
60
- onChange({ field, label, type: "boolean", value: v });
61
- }
62
- }}
63
- >
64
- <SelectTrigger
65
- id={`filter-${field}`}
66
- {...triggerProps}
67
- className={cn("w-full", triggerProps?.className)}
68
- >
69
- <SelectValue />
70
- </SelectTrigger>
71
- <SelectContent {...contentProps}>
72
- <SelectItem value={ALL_VALUE}>All</SelectItem>
73
- <SelectItem value="true">Yes</SelectItem>
74
- <SelectItem value="false">No</SelectItem>
75
- </SelectContent>
76
- </Select>
77
- );
78
- }
@@ -1,128 +0,0 @@
1
- import { useState } from "react";
2
- import { parseISO } from "date-fns";
3
- import {
4
- DatePicker,
5
- DatePickerTrigger,
6
- DatePickerContent,
7
- DatePickerCalendar,
8
- } from "../../../../components/ui/datePicker";
9
-
10
- import { useFilterField } from "../FilterContext";
11
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
12
- import type { FilterFieldType } from "../../utils/filterUtils";
13
- import {
14
- Select,
15
- SelectContent,
16
- SelectItem,
17
- SelectTrigger,
18
- SelectValue,
19
- } from "../../../../components/ui/select";
20
-
21
- type DateOperator = "gt" | "lt";
22
-
23
- const OPERATOR_OPTIONS: { value: DateOperator; label: string }[] = [
24
- { value: "gt", label: "After" },
25
- { value: "lt", label: "Before" },
26
- ];
27
-
28
- function operatorToField(op: DateOperator): "min" | "max" {
29
- return op === "gt" ? "min" : "max";
30
- }
31
-
32
- interface DateFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
33
- field: string;
34
- label: string;
35
- helpText?: string;
36
- filterType?: FilterFieldType;
37
- }
38
-
39
- export function DateFilter({
40
- field,
41
- label,
42
- helpText,
43
- filterType = "date",
44
- className,
45
- ...props
46
- }: DateFilterProps) {
47
- const { value, onChange } = useFilterField(field);
48
-
49
- const initialOp: DateOperator = value?.min ? "gt" : "lt";
50
- const [operator, setOperator] = useState<DateOperator>(initialOp);
51
-
52
- const currentDate = toDate(value?.min ?? value?.max);
53
-
54
- function handleOperatorChange(op: DateOperator) {
55
- setOperator(op);
56
- if (currentDate) {
57
- emitChange(op, currentDate);
58
- }
59
- }
60
-
61
- function handleDateChange(date: Date | undefined) {
62
- if (!date) {
63
- onChange(undefined);
64
- } else {
65
- emitChange(operator, date);
66
- }
67
- }
68
-
69
- function emitChange(op: DateOperator, date: Date) {
70
- const dateStr = toDateString(date);
71
- const f = operatorToField(op);
72
- onChange({
73
- field,
74
- label,
75
- type: filterType,
76
- value: op,
77
- min: f === "min" ? dateStr : undefined,
78
- max: f === "max" ? dateStr : undefined,
79
- });
80
- }
81
-
82
- return (
83
- <FilterFieldWrapper label={label} helpText={helpText} className={className} {...props}>
84
- <div className="flex gap-2">
85
- <Select value={operator} onValueChange={(v) => handleOperatorChange(v as DateOperator)}>
86
- <SelectTrigger className="w-full flex-1">
87
- <SelectValue />
88
- </SelectTrigger>
89
- <SelectContent>
90
- {OPERATOR_OPTIONS.map((opt) => (
91
- <SelectItem key={opt.value} value={opt.value}>
92
- {opt.label}
93
- </SelectItem>
94
- ))}
95
- </SelectContent>
96
- </Select>
97
- <DatePicker>
98
- <DatePickerTrigger
99
- className="w-full flex-2"
100
- date={currentDate}
101
- dateFormat="MMM do, yyyy"
102
- placeholder="Pick a date"
103
- aria-label={label}
104
- />
105
- <DatePickerContent>
106
- <DatePickerCalendar
107
- mode="single"
108
- captionLayout="dropdown"
109
- selected={currentDate}
110
- onSelect={handleDateChange}
111
- />
112
- </DatePickerContent>
113
- </DatePicker>
114
- </div>
115
- </FilterFieldWrapper>
116
- );
117
- }
118
-
119
- export function toDate(value: string | undefined): Date | undefined {
120
- if (!value) return undefined;
121
- const parsed = parseISO(value);
122
- return isNaN(parsed.getTime()) ? undefined : parsed;
123
- }
124
-
125
- export function toDateString(date: Date | undefined): string {
126
- if (!date) return "";
127
- return date.toISOString().split("T")[0];
128
- }