@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,70 +0,0 @@
1
- import type { DateRange } from "react-day-picker";
2
- import {
3
- DatePicker,
4
- DatePickerRangeTrigger,
5
- DatePickerContent,
6
- DatePickerCalendar,
7
- } from "../../../../components/ui/datePicker";
8
-
9
- import { useFilterField } from "../FilterContext";
10
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
11
- import type { FilterFieldType } from "../../utils/filterUtils";
12
- import { toDate, toDateString } from "./DateFilter";
13
-
14
- interface DateRangeFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
15
- field: string;
16
- label: string;
17
- helpText?: string;
18
- filterType?: FilterFieldType;
19
- }
20
-
21
- export function DateRangeFilter({
22
- field,
23
- label,
24
- helpText,
25
- filterType = "daterange",
26
- className,
27
- ...props
28
- }: DateRangeFilterProps) {
29
- const { value, onChange } = useFilterField(field);
30
-
31
- const dateRange: DateRange | undefined =
32
- value?.min || value?.max ? { from: toDate(value?.min), to: toDate(value?.max) } : undefined;
33
-
34
- function handleRangeSelect(range: DateRange | undefined) {
35
- if (!range?.from && !range?.to) {
36
- onChange(undefined);
37
- } else {
38
- onChange({
39
- field,
40
- label,
41
- type: filterType,
42
- min: toDateString(range?.from),
43
- max: toDateString(range?.to),
44
- });
45
- }
46
- }
47
-
48
- return (
49
- <FilterFieldWrapper label={label} helpText={helpText} className={className} {...props}>
50
- <DatePicker>
51
- <DatePickerRangeTrigger
52
- className="w-full"
53
- dateRange={dateRange}
54
- placeholder="Pick a date range"
55
- aria-label={label}
56
- />
57
- <DatePickerContent align="start">
58
- <DatePickerCalendar
59
- mode="range"
60
- captionLayout="dropdown"
61
- defaultMonth={dateRange?.from}
62
- selected={dateRange}
63
- onSelect={handleRangeSelect}
64
- numberOfMonths={2}
65
- />
66
- </DatePickerContent>
67
- </DatePicker>
68
- </FilterFieldWrapper>
69
- );
70
- }
@@ -1,97 +0,0 @@
1
- import {
2
- Popover,
3
- PopoverContent,
4
- PopoverTrigger,
5
- } from "../../../../components/ui/popover";
6
- import { Checkbox } from "../../../../components/ui/checkbox";
7
- import { Button } from "../../../../components/ui/button";
8
- import { cn } from "../../../../lib/utils";
9
- import { Label } from "../../../../components/ui/label";
10
- import { ChevronDown } from "lucide-react";
11
- import { useFilterField } from "../FilterContext";
12
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
13
-
14
- interface MultiSelectFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
15
- field: string;
16
- label: string;
17
- options: Array<{ value: string; label: string }>;
18
- helpText?: string;
19
- }
20
-
21
- export function MultiSelectFilter({
22
- field,
23
- label,
24
- options,
25
- helpText,
26
- className,
27
- ...props
28
- }: MultiSelectFilterProps) {
29
- const { value, onChange } = useFilterField(field);
30
- const selected = value?.value ? value.value.split(",") : [];
31
-
32
- const triggerLabel =
33
- selected.length === 0
34
- ? `Select ${label.toLowerCase()}`
35
- : selected.length === 1
36
- ? (options.find((o) => o.value === selected[0])?.label ?? selected[0])
37
- : `${selected.length} selected`;
38
-
39
- function handleToggle(optionValue: string) {
40
- const next = selected.includes(optionValue)
41
- ? selected.filter((v) => v !== optionValue)
42
- : [...selected, optionValue];
43
-
44
- if (next.length === 0) {
45
- onChange(undefined);
46
- } else {
47
- onChange({
48
- field,
49
- label,
50
- type: "multipicklist",
51
- value: next.join(","),
52
- });
53
- }
54
- }
55
-
56
- return (
57
- <FilterFieldWrapper label={label} helpText={helpText} className={className} {...props}>
58
- <Popover>
59
- <PopoverTrigger asChild>
60
- <Button
61
- variant="outline"
62
- role="combobox"
63
- className={cn(
64
- "w-full justify-between font-normal",
65
- selected.length === 0 && "text-muted-foreground",
66
- )}
67
- >
68
- <span className="truncate">{triggerLabel}</span>
69
- <ChevronDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
70
- </Button>
71
- </PopoverTrigger>
72
- <PopoverContent className="p-2" align="start">
73
- <div className="max-h-48 overflow-y-auto space-y-1">
74
- {options.map((opt) => {
75
- const id = `filter-${field}-${opt.value}`;
76
- return (
77
- <div
78
- key={opt.value}
79
- className="flex items-center gap-2 rounded px-1 py-0.5 hover:bg-accent"
80
- >
81
- <Checkbox
82
- id={id}
83
- checked={selected.includes(opt.value)}
84
- onCheckedChange={() => handleToggle(opt.value)}
85
- />
86
- <Label htmlFor={id} className="text-sm font-normal cursor-pointer w-full">
87
- {opt.label}
88
- </Label>
89
- </div>
90
- );
91
- })}
92
- </div>
93
- </PopoverContent>
94
- </Popover>
95
- </FilterFieldWrapper>
96
- );
97
- }
@@ -1,167 +0,0 @@
1
- import { useState } from "react";
2
- import { Input } from "../../../../components/ui/input";
3
-
4
- import { useFilterField } from "../FilterContext";
5
- import { useDebouncedCallback } from "../../hooks/useDebouncedCallback";
6
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
7
- import type { ActiveFilterValue } from "../../utils/filterUtils";
8
-
9
- interface NumericRangeFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
10
- field: string;
11
- label: string;
12
- helpText?: string;
13
- min?: number;
14
- max?: number;
15
- }
16
-
17
- export function NumericRangeFilter({
18
- field,
19
- label,
20
- helpText,
21
- min,
22
- max,
23
- className,
24
- ...props
25
- }: NumericRangeFilterProps) {
26
- const { value, onChange } = useFilterField(field);
27
- return (
28
- <NumericRangeFilterInputs
29
- field={field}
30
- label={label}
31
- helpText={helpText}
32
- value={value}
33
- onChange={onChange}
34
- min={min}
35
- max={max}
36
- className={className}
37
- {...props}
38
- />
39
- );
40
- }
41
-
42
- interface NumericRangeFilterInputsProps extends Omit<React.ComponentProps<"div">, "onChange"> {
43
- field: string;
44
- label: string;
45
- helpText?: string;
46
- value: ActiveFilterValue | undefined;
47
- onChange: (value: ActiveFilterValue | undefined) => void;
48
- min?: number;
49
- max?: number;
50
- minInputProps?: React.ComponentProps<typeof Input>;
51
- maxInputProps?: React.ComponentProps<typeof Input>;
52
- }
53
-
54
- export function NumericRangeFilterInputs({
55
- field,
56
- label,
57
- helpText,
58
- value,
59
- onChange,
60
- min: boundMin,
61
- max: boundMax,
62
- className,
63
- ...props
64
- }: NumericRangeFilterInputsProps) {
65
- const [localMin, setLocalMin] = useState(value?.min ?? "");
66
- const [localMax, setLocalMax] = useState(value?.max ?? "");
67
-
68
- const externalMin = value?.min ?? "";
69
- const externalMax = value?.max ?? "";
70
- const [prevExternalMin, setPrevExternalMin] = useState(externalMin);
71
- const [prevExternalMax, setPrevExternalMax] = useState(externalMax);
72
- if (prevExternalMin !== externalMin) {
73
- setPrevExternalMin(externalMin);
74
- setLocalMin(externalMin);
75
- }
76
- if (prevExternalMax !== externalMax) {
77
- setPrevExternalMax(externalMax);
78
- setLocalMax(externalMax);
79
- }
80
-
81
- const isOutOfBounds = (v: string) => {
82
- if (v === "") return false;
83
- const n = Number(v);
84
- return (boundMin != null && n < boundMin) || (boundMax != null && n > boundMax);
85
- };
86
- const minOutOfBounds = isOutOfBounds(localMin);
87
- const maxOutOfBounds = isOutOfBounds(localMax);
88
- const isRangeInverted = localMin !== "" && localMax !== "" && Number(localMin) > Number(localMax);
89
- const hasError = minOutOfBounds || maxOutOfBounds || isRangeInverted;
90
-
91
- const debouncedOnChange = useDebouncedCallback((min: string, max: string) => {
92
- if (!min && !max) {
93
- onChange(undefined);
94
- return;
95
- }
96
- const minNum = min !== "" ? Number(min) : null;
97
- const maxNum = max !== "" ? Number(max) : null;
98
- if (minNum != null && maxNum != null && minNum > maxNum) return;
99
- if (
100
- minNum != null &&
101
- ((boundMin != null && minNum < boundMin) || (boundMax != null && minNum > boundMax))
102
- )
103
- return;
104
- if (
105
- maxNum != null &&
106
- ((boundMin != null && maxNum < boundMin) || (boundMax != null && maxNum > boundMax))
107
- )
108
- return;
109
- onChange({ field, label, type: "numeric" as const, min, max });
110
- });
111
-
112
- const boundsLabel =
113
- boundMin != null && boundMax != null
114
- ? `${boundMin}–${boundMax}`
115
- : boundMin != null
116
- ? `${boundMin} or more`
117
- : boundMax != null
118
- ? `${boundMax} or less`
119
- : null;
120
-
121
- const errorMessage = isRangeInverted
122
- ? "Min must not exceed max"
123
- : (minOutOfBounds || maxOutOfBounds) && boundsLabel
124
- ? `Value must be between ${boundsLabel}`
125
- : undefined;
126
-
127
- return (
128
- <FilterFieldWrapper
129
- label={label}
130
- helpText={helpText}
131
- error={errorMessage}
132
- className={className}
133
- {...props}
134
- >
135
- <div className="flex gap-2">
136
- <Input
137
- type="number"
138
- placeholder="Min"
139
- value={localMin}
140
- min={boundMin}
141
- max={boundMax}
142
- onChange={(e) => {
143
- const v = e.target.value;
144
- setLocalMin(v);
145
- debouncedOnChange(v, localMax);
146
- }}
147
- aria-label={`${label} minimum`}
148
- aria-invalid={hasError || undefined}
149
- />
150
- <Input
151
- type="number"
152
- placeholder="Max"
153
- value={localMax}
154
- min={boundMin}
155
- max={boundMax}
156
- onChange={(e) => {
157
- const v = e.target.value;
158
- setLocalMax(v);
159
- debouncedOnChange(localMin, v);
160
- }}
161
- aria-label={`${label} maximum`}
162
- aria-invalid={hasError || undefined}
163
- />
164
- </div>
165
- </FilterFieldWrapper>
166
- );
167
- }
@@ -1,52 +0,0 @@
1
- import { useState } from "react";
2
-
3
- import { SearchBar } from "../SearchBar";
4
- import { useFilterField } from "../FilterContext";
5
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
6
- import { useDebouncedCallback } from "../../hooks/useDebouncedCallback";
7
-
8
- interface SearchFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
9
- field: string;
10
- label: string;
11
- placeholder?: string;
12
- }
13
-
14
- export function SearchFilter({
15
- field,
16
- label,
17
- placeholder,
18
- className,
19
- ...props
20
- }: SearchFilterProps) {
21
- const { value, onChange } = useFilterField(field);
22
- const [localValue, setLocalValue] = useState(value?.value ?? "");
23
-
24
- const externalValue = value?.value ?? "";
25
- const [prevExternalValue, setPrevExternalValue] = useState(externalValue);
26
- if (prevExternalValue !== externalValue) {
27
- setPrevExternalValue(externalValue);
28
- setLocalValue(externalValue);
29
- }
30
-
31
- const debouncedOnChange = useDebouncedCallback((v: string) => {
32
- if (v) {
33
- onChange({ field, label, type: "search", value: v });
34
- } else {
35
- onChange(undefined);
36
- }
37
- });
38
-
39
- return (
40
- <FilterFieldWrapper label={label} htmlFor={`filter-${field}`} className={className} {...props}>
41
- <SearchBar
42
- value={localValue}
43
- handleChange={(v) => {
44
- setLocalValue(v);
45
- debouncedOnChange(v);
46
- }}
47
- placeholder={placeholder}
48
- inputProps={{ id: `filter-${field}` }}
49
- />
50
- </FilterFieldWrapper>
51
- );
52
- }
@@ -1,97 +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 SelectFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
16
- field: string;
17
- label: string;
18
- options: Array<{ value: string; label: string }>;
19
- helpText?: string;
20
- }
21
-
22
- export function SelectFilter({
23
- field,
24
- label,
25
- options,
26
- helpText,
27
- className,
28
- ...props
29
- }: SelectFilterProps) {
30
- const { value, onChange } = useFilterField(field);
31
- return (
32
- <FilterFieldWrapper
33
- label={label}
34
- htmlFor={`filter-${field}`}
35
- helpText={helpText}
36
- className={className}
37
- {...props}
38
- >
39
- <SelectFilterControl
40
- field={field}
41
- label={label}
42
- options={options}
43
- value={value}
44
- onChange={onChange}
45
- />
46
- </FilterFieldWrapper>
47
- );
48
- }
49
-
50
- interface SelectFilterControlProps {
51
- field: string;
52
- label: string;
53
- options: Array<{ value: string; label: string }>;
54
- value: ActiveFilterValue | undefined;
55
- onChange: (value: ActiveFilterValue | undefined) => void;
56
- triggerProps?: React.ComponentProps<typeof SelectTrigger>;
57
- contentProps?: React.ComponentProps<typeof SelectContent>;
58
- }
59
-
60
- export function SelectFilterControl({
61
- field,
62
- label,
63
- options,
64
- value,
65
- onChange,
66
- triggerProps,
67
- contentProps,
68
- }: SelectFilterControlProps) {
69
- return (
70
- <Select
71
- value={value?.value ?? ALL_VALUE}
72
- onValueChange={(v) => {
73
- if (v === ALL_VALUE) {
74
- onChange(undefined);
75
- } else {
76
- onChange({ field, label, type: "picklist", value: v });
77
- }
78
- }}
79
- >
80
- <SelectTrigger
81
- id={`filter-${field}`}
82
- {...triggerProps}
83
- className={cn("w-full", triggerProps?.className)}
84
- >
85
- <SelectValue placeholder={`Select ${label.toLowerCase()}`} />
86
- </SelectTrigger>
87
- <SelectContent {...contentProps}>
88
- <SelectItem value={ALL_VALUE}>All</SelectItem>
89
- {options.map((opt) => (
90
- <SelectItem key={opt.value} value={opt.value}>
91
- {opt.label}
92
- </SelectItem>
93
- ))}
94
- </SelectContent>
95
- </Select>
96
- );
97
- }
@@ -1,93 +0,0 @@
1
- import { useState } from "react";
2
- import { Input } from "../../../../components/ui/input";
3
- import { cn } from "../../../../lib/utils";
4
- import { useFilterField } from "../FilterContext";
5
- import { FilterFieldWrapper } from "./FilterFieldWrapper";
6
- import { useDebouncedCallback } from "../../hooks/useDebouncedCallback";
7
- import type { ActiveFilterValue } from "../../utils/filterUtils";
8
-
9
- interface TextFilterProps extends Omit<React.ComponentProps<"div">, "onChange"> {
10
- field: string;
11
- label: string;
12
- placeholder?: string;
13
- helpText?: string;
14
- }
15
-
16
- export function TextFilter({
17
- field,
18
- label,
19
- placeholder,
20
- helpText,
21
- className,
22
- ...props
23
- }: TextFilterProps) {
24
- const { value, onChange } = useFilterField(field);
25
- return (
26
- <FilterFieldWrapper
27
- label={label}
28
- htmlFor={`filter-${field}`}
29
- helpText={helpText}
30
- className={className}
31
- {...props}
32
- >
33
- <TextFilterInput
34
- field={field}
35
- label={label}
36
- placeholder={placeholder}
37
- value={value}
38
- onChange={onChange}
39
- />
40
- </FilterFieldWrapper>
41
- );
42
- }
43
-
44
- interface TextFilterInputProps extends Omit<
45
- React.ComponentProps<typeof Input>,
46
- "onChange" | "value"
47
- > {
48
- field: string;
49
- label: string;
50
- value: ActiveFilterValue | undefined;
51
- onChange: (value: ActiveFilterValue | undefined) => void;
52
- }
53
-
54
- export function TextFilterInput({
55
- field,
56
- label,
57
- value,
58
- onChange,
59
- className,
60
- ...props
61
- }: TextFilterInputProps) {
62
- const [localValue, setLocalValue] = useState(value?.value ?? "");
63
-
64
- const externalValue = value?.value ?? "";
65
- const [prevExternalValue, setPrevExternalValue] = useState(externalValue);
66
- if (prevExternalValue !== externalValue) {
67
- setPrevExternalValue(externalValue);
68
- setLocalValue(externalValue);
69
- }
70
-
71
- const debouncedOnChange = useDebouncedCallback((v: string) => {
72
- if (v) {
73
- onChange({ field, label, type: "text", value: v });
74
- } else {
75
- onChange(undefined);
76
- }
77
- });
78
-
79
- return (
80
- <Input
81
- id={`filter-${field}`}
82
- type="text"
83
- placeholder={props.placeholder ?? `Filter by ${label.toLowerCase()}...`}
84
- value={localValue}
85
- onChange={(e) => {
86
- setLocalValue(e.target.value);
87
- debouncedOnChange(e.target.value);
88
- }}
89
- className={cn(className)}
90
- {...props}
91
- />
92
- );
93
- }
@@ -1,34 +0,0 @@
1
- import { useCallback, useEffect, useRef } from "react";
2
- import { debounce, FILTER_DEBOUNCE_MS } from "../utils/debounce";
3
-
4
- /**
5
- * Returns a stable debounced wrapper around the provided callback.
6
- *
7
- * The wrapper always invokes the *latest* version of `fn` (via a ref),
8
- * so the debounce timer is never reset when `fn` changes — only when
9
- * the caller invokes the returned function again.
10
- *
11
- * @param fn - The callback to debounce.
12
- * @param delay - Debounce delay in ms. Defaults to `FILTER_DEBOUNCE_MS`.
13
- */
14
- export function useDebouncedCallback<T extends (...args: any[]) => void>(
15
- fn: T,
16
- delay: number = FILTER_DEBOUNCE_MS,
17
- ): (...args: Parameters<T>) => void {
18
- const fnRef = useRef(fn);
19
- const debouncedRef = useRef<((...args: any[]) => void) | null>(null);
20
-
21
- useEffect(() => {
22
- fnRef.current = fn;
23
- });
24
-
25
- useEffect(() => {
26
- debouncedRef.current = debounce((...args: any[]) => {
27
- fnRef.current(...(args as Parameters<T>));
28
- }, delay);
29
- }, [delay]);
30
-
31
- return useCallback((...args: Parameters<T>) => {
32
- debouncedRef.current?.(...args);
33
- }, []);
34
- }