@salesforce/templates 66.11.1 → 66.12.0

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 (378) hide show
  1. package/lib/generators/projectGenerator.js +4 -1
  2. package/lib/generators/projectGenerator.js.map +1 -1
  3. package/lib/templates/project/angularextapp/.forceignore +15 -0
  4. package/lib/templates/project/angularextapp/.husky/pre-commit +4 -0
  5. package/lib/templates/project/angularextapp/.prettierignore +11 -0
  6. package/lib/templates/project/angularextapp/.prettierrc +17 -0
  7. package/lib/templates/project/angularextapp/CHANGELOG.md +4086 -0
  8. package/lib/templates/project/angularextapp/README.md +77 -0
  9. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/angularextapp1.digitalExperience-meta.xml +11 -0
  10. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/_meta.json +5 -0
  11. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/content.json +10 -0
  12. package/lib/templates/project/angularextapp/_p_/_m_/_dc_/angularextapp1.digitalExperienceConfig-meta.xml +8 -0
  13. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
  14. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
  15. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
  16. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
  17. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
  18. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/README.md +85 -0
  19. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +101 -0
  20. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angularextapp.uibundle-meta.xml +8 -0
  21. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
  22. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
  23. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
  24. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
  25. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
  26. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +13600 -0
  27. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +56 -0
  28. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
  29. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
  30. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
  31. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
  32. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
  33. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
  34. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
  35. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
  36. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
  37. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
  38. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/user-profile.service.ts +126 -0
  39. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
  40. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
  41. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +77 -0
  42. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
  43. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
  44. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +53 -0
  45. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +89 -0
  46. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +81 -0
  47. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
  48. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
  49. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
  50. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
  51. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
  52. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
  53. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
  54. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
  55. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
  56. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
  57. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
  58. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
  59. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
  60. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
  61. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
  62. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
  63. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
  64. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
  65. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
  66. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
  67. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
  68. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
  69. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
  70. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
  71. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
  72. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
  73. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
  74. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
  75. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
  76. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
  77. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
  78. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
  79. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
  80. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
  81. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
  82. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
  83. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
  84. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
  85. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
  86. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
  87. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.guard.ts +50 -0
  88. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.service.ts +126 -0
  89. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.html +34 -0
  90. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.ts +94 -0
  91. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.html +2 -0
  92. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.ts +30 -0
  93. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.html +16 -0
  94. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.ts +40 -0
  95. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/config/authentication.config.ts +75 -0
  96. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.html +9 -0
  97. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.ts +26 -0
  98. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.html +26 -0
  99. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.ts +46 -0
  100. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/reactive-form-page.base.ts +50 -0
  101. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.html +55 -0
  102. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.ts +205 -0
  103. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.html +5 -0
  104. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.ts +52 -0
  105. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.html +5 -0
  106. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.scss +17 -0
  107. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.ts +35 -0
  108. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-helpers.ts +68 -0
  109. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-validators.ts +72 -0
  110. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/helpers.ts +85 -0
  111. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-time-servlet.ts +130 -0
  112. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.config.ts +83 -0
  113. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.service.ts +201 -0
  114. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
  115. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
  116. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
  117. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
  118. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
  119. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
  120. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
  121. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
  122. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
  123. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
  124. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
  125. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
  126. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
  127. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
  128. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
  129. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
  130. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
  131. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
  132. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
  133. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
  134. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
  135. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
  136. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
  137. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
  138. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
  139. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
  140. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
  141. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
  142. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
  143. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
  144. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
  145. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
  146. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
  147. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
  148. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
  149. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
  150. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
  151. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.html +68 -0
  152. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.ts +82 -0
  153. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.html +35 -0
  154. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.ts +87 -0
  155. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
  156. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
  157. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
  158. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
  159. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
  160. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.html +47 -0
  161. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.ts +89 -0
  162. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
  163. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
  164. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
  165. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.html +116 -0
  166. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.ts +194 -0
  167. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.html +80 -0
  168. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.ts +93 -0
  169. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.html +60 -0
  170. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.ts +96 -0
  171. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
  172. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
  173. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
  174. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
  175. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
  176. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
  177. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
  178. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
  179. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
  180. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
  181. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls +68 -0
  182. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
  183. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls +77 -0
  184. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls-meta.xml +5 -0
  185. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls +71 -0
  186. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
  187. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls +105 -0
  188. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls-meta.xml +5 -0
  189. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls +162 -0
  190. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls-meta.xml +5 -0
  191. package/lib/templates/project/angularextapp/_p_/_m_/networks/angularextapp.network-meta.xml +60 -0
  192. package/lib/templates/project/angularextapp/_p_/_m_/package.xml +24 -0
  193. package/lib/templates/project/angularextapp/_p_/_m_/permissionsets/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +9 -0
  194. package/lib/templates/project/angularextapp/_p_/_m_/sites/angularextapp.site-meta.xml +31 -0
  195. package/lib/templates/project/angularextapp/config/project-scratch-def.json +13 -0
  196. package/lib/templates/project/angularextapp/eslint.config.js +7 -0
  197. package/lib/templates/project/angularextapp/jest.config.js +6 -0
  198. package/lib/templates/project/angularextapp/package.json +46 -0
  199. package/lib/templates/project/angularextapp/scripts/apex/hello.apex +10 -0
  200. package/lib/templates/project/angularextapp/scripts/gitignore-templates.json +4 -0
  201. package/lib/templates/project/angularextapp/scripts/graphql-search.sh +191 -0
  202. package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +103 -0
  203. package/lib/templates/project/angularextapp/scripts/org-setup-dev.mjs +87 -0
  204. package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +369 -0
  205. package/lib/templates/project/angularextapp/scripts/org-setup-xml.mjs +182 -0
  206. package/lib/templates/project/angularextapp/scripts/org-setup.config.json +9 -0
  207. package/lib/templates/project/angularextapp/scripts/org-setup.mjs +1702 -0
  208. package/lib/templates/project/angularextapp/scripts/sf-project-setup.mjs +103 -0
  209. package/lib/templates/project/angularextapp/scripts/soql/account.soql +6 -0
  210. package/lib/templates/project/angularextapp/scripts/validate-org-setup-config.mjs +38 -0
  211. package/lib/templates/project/angularextapp/sfdx-project.json +12 -0
  212. package/lib/templates/project/angularintapp/.forceignore +15 -0
  213. package/lib/templates/project/angularintapp/.husky/pre-commit +4 -0
  214. package/lib/templates/project/angularintapp/.prettierignore +11 -0
  215. package/lib/templates/project/angularintapp/.prettierrc +17 -0
  216. package/lib/templates/project/angularintapp/CHANGELOG.md +4086 -0
  217. package/lib/templates/project/angularintapp/README.md +77 -0
  218. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
  219. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
  220. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
  221. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
  222. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
  223. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +85 -0
  224. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +101 -0
  225. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angularintapp.uibundle-meta.xml +8 -0
  226. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
  227. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
  228. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
  229. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
  230. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
  231. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +13619 -0
  232. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +57 -0
  233. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
  234. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
  235. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
  236. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
  237. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
  238. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
  239. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
  240. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
  241. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
  242. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
  243. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
  244. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
  245. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +31 -0
  246. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
  247. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
  248. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +52 -0
  249. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +90 -0
  250. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +67 -0
  251. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
  252. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
  253. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
  254. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
  255. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
  256. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
  257. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
  258. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
  259. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
  260. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
  261. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
  262. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
  263. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
  264. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
  265. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
  266. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
  267. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
  268. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
  269. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
  270. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
  271. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
  272. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
  273. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
  274. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
  275. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
  276. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
  277. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
  278. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
  279. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
  280. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
  281. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
  282. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
  283. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
  284. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
  285. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
  286. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
  287. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
  288. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
  289. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
  290. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
  291. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +177 -0
  292. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.html +3 -0
  293. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.ts +119 -0
  294. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
  295. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
  296. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
  297. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
  298. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
  299. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
  300. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
  301. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
  302. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
  303. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
  304. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
  305. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
  306. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
  307. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
  308. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
  309. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
  310. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
  311. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
  312. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
  313. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
  314. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
  315. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
  316. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
  317. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
  318. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
  319. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
  320. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
  321. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
  322. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
  323. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
  324. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
  325. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
  326. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
  327. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
  328. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
  329. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
  330. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
  331. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
  332. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
  333. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
  334. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
  335. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
  336. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
  337. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
  338. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
  339. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/conversation.ts +55 -0
  340. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/globals.d.ts +13 -0
  341. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
  342. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
  343. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.ts +15 -0
  344. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
  345. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
  346. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
  347. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
  348. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
  349. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
  350. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
  351. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
  352. package/lib/templates/project/angularintapp/_p_/_m_/applications/angularintapp.app-meta.xml +17 -0
  353. package/lib/templates/project/angularintapp/_p_/_m_/permissionsets/angularintapp_Access.permissionset-meta.xml +13 -0
  354. package/lib/templates/project/angularintapp/config/project-scratch-def.json +13 -0
  355. package/lib/templates/project/angularintapp/eslint.config.js +7 -0
  356. package/lib/templates/project/angularintapp/jest.config.js +6 -0
  357. package/lib/templates/project/angularintapp/package.json +46 -0
  358. package/lib/templates/project/angularintapp/scripts/apex/hello.apex +10 -0
  359. package/lib/templates/project/angularintapp/scripts/gitignore-templates.json +4 -0
  360. package/lib/templates/project/angularintapp/scripts/graphql-search.sh +191 -0
  361. package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +103 -0
  362. package/lib/templates/project/angularintapp/scripts/org-setup-dev.mjs +87 -0
  363. package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +369 -0
  364. package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +182 -0
  365. package/lib/templates/project/angularintapp/scripts/org-setup.config.json +9 -0
  366. package/lib/templates/project/angularintapp/scripts/org-setup.mjs +1702 -0
  367. package/lib/templates/project/angularintapp/scripts/sf-project-setup.mjs +103 -0
  368. package/lib/templates/project/angularintapp/scripts/soql/account.soql +6 -0
  369. package/lib/templates/project/angularintapp/scripts/validate-org-setup-config.mjs +38 -0
  370. package/lib/templates/project/angularintapp/sfdx-project.json +12 -0
  371. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +589 -561
  372. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +589 -561
  373. package/lib/templates/uiBundles/angularbasic/package-lock.json +147 -168
  374. package/lib/templates/uiBundles/reactbasic/package-lock.json +589 -561
  375. package/lib/utils/types.d.ts +1 -1
  376. package/lib/utils/uiBundleTemplateUtils.js +10 -0
  377. package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
  378. package/package.json +4 -2
@@ -0,0 +1,8 @@
1
+ <app-filter-field-wrapper [label]="config().label" [htmlFor]="inputId()">
2
+ <app-input
3
+ type="search"
4
+ [placeholder]="config().placeholder ?? 'Search...'"
5
+ [value]="localValue()"
6
+ (valueChange)="onValueChange($event)"
7
+ />
8
+ </app-filter-field-wrapper>
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import {
7
+ ChangeDetectionStrategy,
8
+ Component,
9
+ DestroyRef,
10
+ effect,
11
+ inject,
12
+ input,
13
+ signal,
14
+ } from "@angular/core";
15
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
16
+ import { Subject } from "rxjs";
17
+ import { debounceTime } from "rxjs/operators";
18
+ // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
19
+ // it lands at uiBundles/<target>/src/app/components/ui/input/..., three levels up.
20
+ import { InputComponent } from "../../../components/ui/input/input";
21
+ import { ObjectSearchStateService } from "../object-search-state.service";
22
+ import { FILTER_DEBOUNCE_MS } from "../utils/debounce";
23
+ import type { FilterFieldConfig } from "../utils/filter-utils";
24
+ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
25
+
26
+ /**
27
+ * Multi-field search filter — a debounced input whose value is applied via
28
+ * `like %value%` across every field named in `config.searchFields` (combined
29
+ * with a top-level `or`, see {@link buildFilter}).
30
+ *
31
+ * Shape mirrors {@link TextFilterComponent} but emits a `type: 'search'`
32
+ * {@link ActiveFilterValue} so `filter-utils` picks the multi-field path.
33
+ */
34
+ @Component({
35
+ selector: "app-search-filter",
36
+ changeDetection: ChangeDetectionStrategy.OnPush,
37
+ imports: [InputComponent, FilterFieldWrapperComponent],
38
+ templateUrl: "./search-filter.html",
39
+ })
40
+ export class SearchFilterComponent {
41
+ private readonly state = inject(ObjectSearchStateService);
42
+ private readonly destroyRef = inject(DestroyRef);
43
+
44
+ /** Field config: `field`, `label`, `placeholder`, `searchFields`, ... */
45
+ readonly config = input.required<FilterFieldConfig>();
46
+
47
+ protected readonly localValue = signal<string>("");
48
+ protected readonly inputId = signal<string>("");
49
+ private readonly commit$ = new Subject<string>();
50
+
51
+ constructor() {
52
+ this.commit$
53
+ .pipe(debounceTime(FILTER_DEBOUNCE_MS), takeUntilDestroyed(this.destroyRef))
54
+ .subscribe((v) => this.commit(v));
55
+
56
+ effect(() => {
57
+ const cfg = this.config();
58
+ this.inputId.set(`filter-${cfg.field}`);
59
+ const external = this.state.filterFor(cfg.field)?.value ?? "";
60
+ this.localValue.set(external);
61
+ });
62
+ }
63
+
64
+ protected onValueChange(v: string): void {
65
+ this.localValue.set(v);
66
+ this.commit$.next(v);
67
+ }
68
+
69
+ private commit(v: string): void {
70
+ const cfg = this.config();
71
+ if (v) {
72
+ this.state.setFilter(cfg.field, {
73
+ field: cfg.field,
74
+ label: cfg.label,
75
+ type: "search",
76
+ value: v,
77
+ });
78
+ } else {
79
+ this.state.removeFilter(cfg.field);
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,12 @@
1
+ <app-filter-field-wrapper
2
+ [label]="config().label"
3
+ [htmlFor]="inputId()"
4
+ [helpText]="config().helpText"
5
+ >
6
+ <app-select
7
+ [placeholder]="'Select ' + config().label.toLowerCase()"
8
+ [options]="options()"
9
+ [value]="currentValue()"
10
+ (valueChange)="onValueChange($event)"
11
+ />
12
+ </app-filter-field-wrapper>
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { ChangeDetectionStrategy, Component, computed, inject, input } from "@angular/core";
7
+ // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
8
+ // it lands at uiBundles/<target>/src/app/components/ui/select/..., three levels up.
9
+ import {
10
+ SelectComponent,
11
+ type AppSelectOption,
12
+ } from "../../../components/ui/select/select";
13
+ import { ObjectSearchStateService } from "../object-search-state.service";
14
+ import type { FilterFieldConfig } from "../utils/filter-utils";
15
+ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
16
+
17
+ /**
18
+ * Single-value picklist filter — a select rendered from `config.options` with
19
+ * a leading "All" entry (empty value) that clears the filter.
20
+ *
21
+ * Emits a `type: 'picklist'` filter which `buildSingleFilter` maps to
22
+ * `{ [field]: { eq: value } }`.
23
+ */
24
+ const ALL_VALUE = "";
25
+
26
+ @Component({
27
+ selector: "app-select-filter",
28
+ changeDetection: ChangeDetectionStrategy.OnPush,
29
+ imports: [SelectComponent, FilterFieldWrapperComponent],
30
+ templateUrl: "./select-filter.html",
31
+ })
32
+ export class SelectFilterComponent {
33
+ private readonly state = inject(ObjectSearchStateService);
34
+
35
+ /** Field config: `field`, `label`, `options`, `helpText`, ... */
36
+ readonly config = input.required<FilterFieldConfig>();
37
+
38
+ /** DOM id shared by the wrapper label and the underlying control. */
39
+ protected readonly inputId = computed(() => `filter-${this.config().field}`);
40
+
41
+ /** Options rendered in the select, with an "All" (clear) sentinel prepended. */
42
+ protected readonly options = computed<readonly AppSelectOption[]>(() => [
43
+ { value: ALL_VALUE, label: "All" },
44
+ ...(this.config().options ?? []),
45
+ ]);
46
+
47
+ /** Current selection, reading through to shared state so URL changes reflect. */
48
+ protected readonly currentValue = computed(
49
+ () => this.state.filterFor(this.config().field)?.value ?? ALL_VALUE,
50
+ );
51
+
52
+ protected onValueChange(v: string): void {
53
+ const cfg = this.config();
54
+ if (v === ALL_VALUE) {
55
+ this.state.removeFilter(cfg.field);
56
+ } else {
57
+ this.state.setFilter(cfg.field, {
58
+ field: cfg.field,
59
+ label: cfg.label,
60
+ type: "picklist",
61
+ value: v,
62
+ });
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,12 @@
1
+ <app-filter-field-wrapper
2
+ [label]="config().label"
3
+ [htmlFor]="inputId()"
4
+ [helpText]="config().helpText"
5
+ >
6
+ <app-input
7
+ type="text"
8
+ [placeholder]="config().placeholder ?? 'Filter by ' + config().label.toLowerCase() + '...'"
9
+ [value]="localValue()"
10
+ (valueChange)="onValueChange($event)"
11
+ />
12
+ </app-filter-field-wrapper>
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import {
7
+ ChangeDetectionStrategy,
8
+ Component,
9
+ DestroyRef,
10
+ effect,
11
+ inject,
12
+ input,
13
+ signal,
14
+ } from "@angular/core";
15
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
16
+ import { Subject } from "rxjs";
17
+ import { debounceTime } from "rxjs/operators";
18
+ // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
19
+ // it lands at uiBundles/<target>/src/app/components/ui/input/..., three levels up.
20
+ import { InputComponent } from "../../../components/ui/input/input";
21
+ import { ObjectSearchStateService } from "../object-search-state.service";
22
+ import { FILTER_DEBOUNCE_MS } from "../utils/debounce";
23
+ import type { FilterFieldConfig } from "../utils/filter-utils";
24
+ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
25
+
26
+ /**
27
+ * Text filter — free-text input that writes a `like %value%` clause via
28
+ * {@link ObjectSearchStateService.setFilter}. Keystrokes update the local
29
+ * signal immediately (for a responsive UI) and flush to shared state on a
30
+ * {@link FILTER_DEBOUNCE_MS}ms trailing debounce (to avoid a query per key).
31
+ *
32
+ * Reads the current value from `state.filterFor(config.field)` so URL /
33
+ * reset-all changes reflect back into the input.
34
+ */
35
+ @Component({
36
+ selector: "app-text-filter",
37
+ changeDetection: ChangeDetectionStrategy.OnPush,
38
+ imports: [InputComponent, FilterFieldWrapperComponent],
39
+ templateUrl: "./text-filter.html",
40
+ })
41
+ export class TextFilterComponent {
42
+ private readonly state = inject(ObjectSearchStateService);
43
+ private readonly destroyRef = inject(DestroyRef);
44
+
45
+ /** Field config: `field`, `label`, `placeholder`, `helpText`, ... */
46
+ readonly config = input.required<FilterFieldConfig>();
47
+
48
+ /** Local (uncommitted) value that drives the input while the user is typing. */
49
+ protected readonly localValue = signal<string>("");
50
+
51
+ /** DOM id shared by the wrapper label and the underlying input. */
52
+ protected readonly inputId = signal<string>("");
53
+
54
+ /** Coalesces rapid keystrokes into one shared-state write. */
55
+ private readonly commit$ = new Subject<string>();
56
+
57
+ constructor() {
58
+ this.commit$
59
+ .pipe(debounceTime(FILTER_DEBOUNCE_MS), takeUntilDestroyed(this.destroyRef))
60
+ .subscribe((v) => this.commit(v));
61
+
62
+ // Sync the input with the shared state (URL restore, reset-all, ...).
63
+ // Mirrors the React "reset local when external changes" pattern.
64
+ effect(() => {
65
+ const cfg = this.config();
66
+ this.inputId.set(`filter-${cfg.field}`);
67
+ const external = this.state.filterFor(cfg.field)?.value ?? "";
68
+ this.localValue.set(external);
69
+ });
70
+ }
71
+
72
+ protected onValueChange(v: string): void {
73
+ this.localValue.set(v);
74
+ this.commit$.next(v);
75
+ }
76
+
77
+ private commit(v: string): void {
78
+ const cfg = this.config();
79
+ if (v) {
80
+ this.state.setFilter(cfg.field, {
81
+ field: cfg.field,
82
+ label: cfg.label,
83
+ type: "text",
84
+ value: v,
85
+ });
86
+ } else {
87
+ this.state.removeFilter(cfg.field);
88
+ }
89
+ }
90
+ }
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { computed, DestroyRef, inject, Injectable, signal, type Signal } from "@angular/core";
7
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
8
+ import { ActivatedRoute, Router } from "@angular/router";
9
+ import { Subject } from "rxjs";
10
+ import { debounceTime } from "rxjs/operators";
11
+ import {
12
+ buildFilter,
13
+ filtersToQueryParams,
14
+ queryParamsToFilters,
15
+ type ActiveFilterValue,
16
+ type FilterFieldConfig,
17
+ } from "./utils/filter-utils";
18
+ import { buildOrderBy, type SortState } from "./utils/sort-utils";
19
+
20
+ /** How long to wait before flushing state changes to the URL. */
21
+ const URL_SYNC_DEBOUNCE_MS = 300;
22
+
23
+ /** Cursor-pagination configuration for an object-search page. */
24
+ export interface PaginationConfig {
25
+ defaultPageSize: number;
26
+ validPageSizes: number[];
27
+ }
28
+
29
+ /** Derived, API-ready query signals returned from {@link ObjectSearchStateService.init}. */
30
+ export interface ObjectSearchQuery<TFilter, TOrderBy> {
31
+ where: Signal<TFilter | undefined>;
32
+ orderBy: Signal<TOrderBy | undefined>;
33
+ }
34
+
35
+ /**
36
+ * Filter / sort / cursor-pagination state for one object-search page — the
37
+ * Angular analogue of the React `useObjectSearchParams` hook plus
38
+ * `FilterContext`.
39
+ *
40
+ * ## State model
41
+ * Signals drive instant UI updates. The URL query params are the durable source
42
+ * of truth so a refresh or shared link restores the same view. URL writes are
43
+ * debounced (300 ms) to avoid history spam.
44
+ *
45
+ * Unlike the React reference, the pagination cursor (`after`) is part of the URL
46
+ * (see {@link filtersToQueryParams}), so a deep-linked page N fetches page N's
47
+ * rows rather than page 1's rows shown under a higher page number.
48
+ *
49
+ * ## Scope
50
+ * Provide per route/component (`providers: [ObjectSearchStateService]`), NOT in
51
+ * root — each search page owns its own state and cursor stack.
52
+ *
53
+ * ## Usage
54
+ * Call {@link init} once from the hosting component with the field/pagination
55
+ * config, then read the exposed signals and call the mutators.
56
+ */
57
+ @Injectable()
58
+ export class ObjectSearchStateService {
59
+ private readonly router = inject(Router);
60
+ private readonly route = inject(ActivatedRoute);
61
+ private readonly destroyRef = inject(DestroyRef);
62
+
63
+ private filterConfigs: FilterFieldConfig[] = [];
64
+ private defaultPageSize = 10;
65
+ private validPageSizes: number[] = [10];
66
+ private initialized = false;
67
+
68
+ // -- Core state signals -----------------------------------------------------
69
+ private readonly _filters = signal<ActiveFilterValue[]>([]);
70
+ private readonly _sort = signal<SortState | null>(null);
71
+ private readonly _pageSize = signal<number>(10);
72
+ private readonly _pageIndex = signal<number>(0);
73
+ private readonly _afterCursor = signal<string | undefined>(undefined);
74
+
75
+ /** Cursor stack for "previous page" — mirrors the React ref-held stack. */
76
+ private cursorStack: string[] = [];
77
+ /** Coalesces rapid state changes into a single debounced URL write. */
78
+ private readonly urlSync$ = new Subject<void>();
79
+
80
+ // -- Public read signals -----------------------------------------------------
81
+ readonly filters: Signal<ActiveFilterValue[]> = this._filters.asReadonly();
82
+ readonly sort: Signal<SortState | null> = this._sort.asReadonly();
83
+ readonly pageSize: Signal<number> = this._pageSize.asReadonly();
84
+ readonly pageIndex: Signal<number> = this._pageIndex.asReadonly();
85
+ readonly afterCursor: Signal<string | undefined> = this._afterCursor.asReadonly();
86
+ readonly hasActiveFilters = computed(() => this._filters().length > 0);
87
+ readonly hasPreviousPage = computed(() => this._pageIndex() > 0);
88
+
89
+ constructor() {
90
+ this.urlSync$
91
+ .pipe(debounceTime(URL_SYNC_DEBOUNCE_MS), takeUntilDestroyed(this.destroyRef))
92
+ .subscribe(() => this.flushToUrl());
93
+ }
94
+
95
+ /**
96
+ * Initializes the service from the given config and seeds state from the
97
+ * current URL. Safe to call once; subsequent calls only recompute the
98
+ * derived query signals.
99
+ */
100
+ init<TFilter, TOrderBy>(
101
+ filterConfigs: FilterFieldConfig[],
102
+ paginationConfig?: PaginationConfig,
103
+ ): ObjectSearchQuery<TFilter, TOrderBy> {
104
+ if (!this.initialized) {
105
+ this.initialized = true;
106
+ this.filterConfigs = filterConfigs;
107
+ this.defaultPageSize = paginationConfig?.defaultPageSize ?? 10;
108
+ this.validPageSizes = paginationConfig?.validPageSizes ?? [this.defaultPageSize];
109
+ this.seedFromUrl();
110
+ }
111
+
112
+ const where = computed(() => buildFilter<TFilter>(this._filters(), this.filterConfigs));
113
+ const orderBy = computed(() => buildOrderBy<TOrderBy>(this._sort()));
114
+ return { where, orderBy };
115
+ }
116
+
117
+ // -- Filter mutators ---------------------------------------------------------
118
+
119
+ /** Adds or replaces the filter for `field`; `undefined` removes it. */
120
+ setFilter(field: string, value: ActiveFilterValue | undefined): void {
121
+ this._filters.update((prev) => {
122
+ const next = prev.filter((f) => f.field !== field);
123
+ if (value) next.push(value);
124
+ return next;
125
+ });
126
+ this.resetPagination();
127
+ this.urlSync$.next();
128
+ }
129
+
130
+ /** Removes the active filter for `field`, if any. */
131
+ removeFilter(field: string): void {
132
+ this._filters.update((prev) => prev.filter((f) => f.field !== field));
133
+ this.resetPagination();
134
+ this.urlSync$.next();
135
+ }
136
+
137
+ /** Reads the active filter value for a field (for filter components). */
138
+ filterFor(field: string): ActiveFilterValue | undefined {
139
+ return this._filters().find((f) => f.field === field);
140
+ }
141
+
142
+ // -- Sort mutator ------------------------------------------------------------
143
+
144
+ /** Sets (or clears) the sort; resets pagination to the first page. */
145
+ setSort(sort: SortState | null): void {
146
+ this._sort.set(sort);
147
+ this.resetPagination();
148
+ this.urlSync$.next();
149
+ }
150
+
151
+ // -- Pagination mutators -----------------------------------------------------
152
+
153
+ /** Advances to the next page using the supplied `endCursor`. */
154
+ goToNextPage(endCursor: string): void {
155
+ this.cursorStack = [...this.cursorStack, endCursor];
156
+ this._afterCursor.set(endCursor);
157
+ this._pageIndex.update((i) => i + 1);
158
+ this.urlSync$.next();
159
+ }
160
+
161
+ /** Returns to the previous page by popping the cursor stack. */
162
+ goToPreviousPage(): void {
163
+ this.cursorStack = this.cursorStack.slice(0, -1);
164
+ const prev =
165
+ this.cursorStack.length > 0 ? this.cursorStack[this.cursorStack.length - 1] : undefined;
166
+ this._afterCursor.set(prev);
167
+ this._pageIndex.update((i) => Math.max(0, i - 1));
168
+ this.urlSync$.next();
169
+ }
170
+
171
+ /** Sets a validated page size and resets pagination. */
172
+ setPageSize(size: number): void {
173
+ this._pageSize.set(this.getValidPageSize(size));
174
+ this.resetPagination();
175
+ this.urlSync$.next();
176
+ }
177
+
178
+ // -- Reset -------------------------------------------------------------------
179
+
180
+ /** Clears all filters, sort, and pagination in one call (flushed at once). */
181
+ resetAll(): void {
182
+ this._filters.set([]);
183
+ this._sort.set(null);
184
+ this._pageSize.set(this.defaultPageSize);
185
+ this.resetPagination();
186
+ this.flushToUrl();
187
+ }
188
+
189
+ // -- Internals ---------------------------------------------------------------
190
+
191
+ private resetPagination(): void {
192
+ this._pageIndex.set(0);
193
+ this._afterCursor.set(undefined);
194
+ this.cursorStack = [];
195
+ }
196
+
197
+ private getValidPageSize(size: number): number {
198
+ return this.validPageSizes.includes(size) ? size : this.defaultPageSize;
199
+ }
200
+
201
+ private seedFromUrl(): void {
202
+ const params = this.route.snapshot.queryParams as Record<string, string | undefined>;
203
+ const parsed = queryParamsToFilters(params, this.filterConfigs);
204
+ this._filters.set(parsed.filters);
205
+ this._sort.set(parsed.sort);
206
+ this._pageSize.set(this.getValidPageSize(parsed.pageSize ?? this.defaultPageSize));
207
+ this._pageIndex.set(parsed.pageIndex);
208
+ this._afterCursor.set(parsed.afterCursor);
209
+ // Rebuild a minimal cursor stack so "previous" works after a deep link.
210
+ // Pages before the current one are unknown, so pad the stack with the
211
+ // current cursor; going back drains it and eventually returns to page 1.
212
+ if (parsed.pageIndex > 0 && parsed.afterCursor) {
213
+ this.cursorStack = Array<string>(parsed.pageIndex).fill(parsed.afterCursor);
214
+ }
215
+ }
216
+
217
+ private flushToUrl(): void {
218
+ const queryParams = filtersToQueryParams({
219
+ filters: this._filters(),
220
+ sort: this._sort(),
221
+ pageSize: this._pageSize(),
222
+ pageIndex: this._pageIndex(),
223
+ afterCursor: this._afterCursor(),
224
+ });
225
+ void this.router.navigate([], {
226
+ relativeTo: this.route,
227
+ queryParams,
228
+ // Replace so filter typing doesn't flood browser history.
229
+ replaceUrl: true,
230
+ });
231
+ }
232
+ }
@@ -0,0 +1,8 @@
1
+ <app-paginator
2
+ [length]="totalCount() ?? 0"
3
+ [pageIndex]="pageIndex()"
4
+ [pageSize]="pageSize()"
5
+ [pageSizeOptions]="pageSizeOptions()"
6
+ [disabled]="disabled()"
7
+ (page)="onPage($event)"
8
+ />
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { ChangeDetectionStrategy, Component, inject, input } from "@angular/core";
7
+ import type { PageEvent } from "@angular/material/paginator";
8
+ import { PaginatorComponent } from "../../../components/ui/paginator/paginator";
9
+ import { ObjectSearchStateService } from "../object-search-state.service";
10
+
11
+ /**
12
+ * Cursor-pagination bridge. Feeds the shared cursor state into the presentational
13
+ * {@link PaginatorComponent} (`app-paginator`) and translates its offset-style
14
+ * `(page)` event back into the cursor walk the state service understands.
15
+ *
16
+ * State comes from the shared {@link ObjectSearchStateService} (`pageIndex`,
17
+ * `pageSize`); the hosting page supplies the cursor-derived inputs
18
+ * (`totalCount`, `hasNextPage`, `endCursor`) after each fetch. A next-page step
19
+ * needs the current `endCursor`; a previous step and page-size changes are
20
+ * handled entirely by the state service's cursor stack.
21
+ */
22
+ @Component({
23
+ selector: "app-pagination-controls",
24
+ changeDetection: ChangeDetectionStrategy.OnPush,
25
+ imports: [PaginatorComponent],
26
+ templateUrl: "./pagination.html",
27
+ })
28
+ export class PaginationControlsComponent {
29
+ /** Total row count from the latest fetch; drives the paginator's range label. */
30
+ readonly totalCount = input<number | undefined>(undefined);
31
+ /** Whether the API reports another page after the current one. */
32
+ readonly hasNextPage = input<boolean>(false);
33
+ /** `endCursor` from the latest page-info; forwarded to `goToNextPage`. */
34
+ readonly endCursor = input<string | undefined>(undefined);
35
+ /** Allowed page-size choices. */
36
+ readonly pageSizeOptions = input.required<readonly number[]>();
37
+ /** Disable navigation and the size select (e.g. while loading). */
38
+ readonly disabled = input<boolean>(false);
39
+
40
+ private readonly state = inject(ObjectSearchStateService);
41
+ protected readonly pageIndex = this.state.pageIndex;
42
+ protected readonly pageSize = this.state.pageSize;
43
+
44
+ /**
45
+ * Route Material's offset-style page event onto the cursor model: a page-size
46
+ * change resets pagination; a forward step walks the `endCursor`; a backward
47
+ * step pops the cursor stack.
48
+ */
49
+ protected onPage(event: PageEvent): void {
50
+ if (event.pageSize !== this.pageSize()) {
51
+ this.state.setPageSize(event.pageSize);
52
+ return;
53
+ }
54
+ if (event.pageIndex > this.pageIndex()) {
55
+ const cursor = this.endCursor();
56
+ if (cursor && this.hasNextPage()) this.state.goToNextPage(cursor);
57
+ } else if (event.pageIndex < this.pageIndex()) {
58
+ this.state.goToPreviousPage();
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,59 @@
1
+ <div class="flex items-center gap-2 w-full">
2
+ <div class="relative flex-1">
3
+ <svg
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ class="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none z-10"
6
+ viewBox="0 0 24 24"
7
+ fill="none"
8
+ stroke="currentColor"
9
+ stroke-width="2"
10
+ stroke-linecap="round"
11
+ stroke-linejoin="round"
12
+ aria-hidden="true"
13
+ >
14
+ <circle cx="11" cy="11" r="8" />
15
+ <path d="m21 21-4.3-4.3" />
16
+ </svg>
17
+ <app-input
18
+ class="pl-9 block"
19
+ type="text"
20
+ [placeholder]="searchConfig().placeholder ?? ''"
21
+ [label]="searchConfig().label"
22
+ [(value)]="term"
23
+ />
24
+ </div>
25
+ <app-popover [(open)]="popoverOpen" align="end">
26
+ <app-button
27
+ trigger
28
+ appearance="outlined"
29
+ [attr.aria-expanded]="popoverOpen()"
30
+ aria-label="Toggle filters"
31
+ class="gap-2"
32
+ >
33
+ <svg
34
+ xmlns="http://www.w3.org/2000/svg"
35
+ class="h-4 w-4"
36
+ viewBox="0 0 24 24"
37
+ fill="none"
38
+ stroke="currentColor"
39
+ stroke-width="2"
40
+ stroke-linecap="round"
41
+ stroke-linejoin="round"
42
+ aria-hidden="true"
43
+ >
44
+ <path d="M3 6h18M7 12h10M10 18h4" />
45
+ </svg>
46
+ <span>Filters</span>
47
+ @if (nonSearchFilterCount() > 0) {
48
+ <span
49
+ class="inline-flex items-center justify-center h-5 min-w-5 rounded-full bg-primary text-primary-foreground text-xs px-1"
50
+ >
51
+ {{ nonSearchFilterCount() }}
52
+ </span>
53
+ }
54
+ </app-button>
55
+ <div class="p-3 min-w-72 max-w-96 space-y-3">
56
+ <ng-content select="[filters]" />
57
+ </div>
58
+ </app-popover>
59
+ </div>