@salesforce/ui-bundle-template-app-angular-template-b2e 11.60.0 → 11.62.1

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 (227) hide show
  1. package/dist/CHANGELOG.md +24 -0
  2. package/dist/force-app/main/default/uiBundles/angularintapp/angular.json +2 -7
  3. package/dist/force-app/main/default/uiBundles/angularintapp/components.json +6 -0
  4. package/dist/force-app/main/default/uiBundles/angularintapp/eslint.config.js +9 -1
  5. package/dist/force-app/main/default/uiBundles/angularintapp/package.json +16 -11
  6. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/app.config.ts +4 -6
  7. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/app.routes.ts +3 -2
  8. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/alert/alert.html +9 -13
  9. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/alert/alert.ts +16 -28
  10. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/button/button.html +19 -10
  11. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/button/button.ts +34 -25
  12. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/card/card.ts +40 -50
  13. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/collapsible/collapsible.html +38 -10
  14. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/collapsible/collapsible.ts +6 -11
  15. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/date-picker/date-picker.html +17 -22
  16. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/date-picker/date-picker.ts +29 -21
  17. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/date-range-picker/date-range-picker.html +16 -30
  18. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/date-range-picker/date-range-picker.ts +39 -36
  19. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/dialog/dialog.html +13 -30
  20. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/dialog/dialog.ts +6 -21
  21. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
  22. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
  23. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/field/field.html +5 -11
  24. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/field/field.ts +10 -18
  25. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/field-appearance.ts +8 -0
  26. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/icon/icon.ts +62 -0
  27. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/input/input.html +32 -17
  28. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/input/input.ts +57 -14
  29. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/label/label.ts +8 -4
  30. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/paginator/paginator.html +74 -10
  31. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/paginator/paginator.ts +74 -18
  32. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/paginator/types.ts +13 -0
  33. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/popover/popover.html +10 -38
  34. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/popover/popover.ts +12 -15
  35. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/select/select.html +34 -22
  36. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/select/select.ts +25 -34
  37. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/separator/separator.ts +11 -36
  38. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/skeleton/skeleton.ts +5 -9
  39. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/spinner/spinner.ts +14 -21
  40. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/agentforce/conversation.html +1 -1
  41. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/agentforce/conversation.ts +0 -3
  42. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/breadcrumb/breadcrumb.html +4 -24
  43. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/breadcrumb/breadcrumb.ts +3 -16
  44. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/date-filter.ts +1 -1
  45. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/date-range-filter.html +2 -1
  46. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/date-range-filter.ts +6 -15
  47. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/filter-field-wrapper.html +2 -0
  48. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/filter-field-wrapper.ts +2 -17
  49. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/multi-select-filter.html +2 -1
  50. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/numeric-range-filter.ts +3 -21
  51. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/search-filter.html +3 -3
  52. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/search-filter.ts +9 -13
  53. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/select-filter.html +2 -5
  54. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/select-filter.ts +1 -15
  55. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/text-filter.html +2 -5
  56. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/filters/text-filter.ts +3 -17
  57. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/pagination/pagination.ts +4 -20
  58. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/search-bar/search-bar.html +10 -59
  59. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/search-bar/search-bar.ts +13 -93
  60. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/sort-control/sort-control.html +3 -29
  61. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/features/object-search/sort-control/sort-control.ts +5 -12
  62. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/account-detail/account-detail-page.html +1 -23
  63. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/account-detail/account-detail-page.ts +3 -23
  64. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/account-search/account-search-page.html +1 -19
  65. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/account-search/account-search-page.ts +8 -36
  66. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/home/home.html +15 -4
  67. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/home/home.spec.ts +8 -6
  68. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/home/home.ts +56 -4
  69. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/alert/hlm-alert-action.ts +14 -0
  70. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/alert/hlm-alert-description.ts +17 -0
  71. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/alert/hlm-alert-title.ts +17 -0
  72. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/alert/hlm-alert.ts +35 -0
  73. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/alert/index.ts +16 -0
  74. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/button/hlm-button.token.ts +22 -0
  75. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/button/hlm-button.ts +72 -0
  76. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/button/index.ts +6 -0
  77. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/calendar/hlm-calendar-multi.ts +195 -0
  78. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/calendar/hlm-calendar-range.ts +194 -0
  79. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/calendar/hlm-calendar.ts +189 -0
  80. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/calendar/hlm-month-year-calendar.ts +119 -0
  81. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/calendar/index.ts +16 -0
  82. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-action.ts +12 -0
  83. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-avatar.ts +14 -0
  84. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-content.ts +12 -0
  85. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-description.ts +12 -0
  86. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-footer.ts +12 -0
  87. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-header.ts +15 -0
  88. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card-title.ts +12 -0
  89. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card.token.ts +19 -0
  90. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/hlm-card.ts +22 -0
  91. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/card/index.ts +28 -0
  92. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/collapsible/hlm-collapsible-content.ts +14 -0
  93. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/collapsible/hlm-collapsible-trigger.ts +9 -0
  94. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/collapsible/hlm-collapsible.ts +15 -0
  95. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/collapsible/index.ts +13 -0
  96. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-multi-input.ts +104 -0
  97. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker-anchor.ts +23 -0
  98. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker-input.ts +118 -0
  99. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker-multi.token.ts +109 -0
  100. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker-multi.ts +220 -0
  101. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker-trigger.ts +104 -0
  102. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker.token.ts +69 -0
  103. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-picker.ts +203 -0
  104. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-range-input.ts +120 -0
  105. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-range-picker.token.ts +86 -0
  106. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-date-range-picker.ts +252 -0
  107. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-month-year-input.ts +105 -0
  108. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-month-year-picker.token.ts +89 -0
  109. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/hlm-month-year-picker.ts +196 -0
  110. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/date-picker/index.ts +38 -0
  111. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-close.ts +9 -0
  112. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-content.ts +74 -0
  113. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-description.ts +17 -0
  114. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-footer.ts +15 -0
  115. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-header.ts +12 -0
  116. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-overlay.ts +27 -0
  117. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-portal.ts +8 -0
  118. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-title.ts +14 -0
  119. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog-trigger.ts +14 -0
  120. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog.service.ts +46 -0
  121. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/hlm-dialog.ts +24 -0
  122. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dialog/index.ts +35 -0
  123. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  124. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox.ts +54 -0
  125. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  126. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-group.ts +14 -0
  127. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  128. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-item.ts +42 -0
  129. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-label.ts +20 -0
  130. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio-indicator.ts +21 -0
  131. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio.ts +49 -0
  132. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-separator.ts +12 -0
  133. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-shortcut.ts +15 -0
  134. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub-trigger.ts +52 -0
  135. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub.ts +53 -0
  136. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-token.ts +26 -0
  137. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu-trigger.ts +46 -0
  138. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/hlm-dropdown-menu.ts +57 -0
  139. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/dropdown-menu/index.ts +49 -0
  140. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-content.ts +12 -0
  141. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-description.ts +53 -0
  142. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-error.ts +100 -0
  143. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-group.ts +15 -0
  144. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-label.ts +17 -0
  145. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-legend.ts +19 -0
  146. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-separator.ts +24 -0
  147. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-set.ts +15 -0
  148. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field-title.ts +15 -0
  149. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/hlm-field.ts +47 -0
  150. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/field/index.ts +34 -0
  151. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input/hlm-input.ts +21 -0
  152. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input/index.ts +5 -0
  153. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input-group/hlm-input-group-addon.ts +40 -0
  154. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input-group/hlm-input-group-button.ts +47 -0
  155. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input-group/hlm-input-group-input.ts +17 -0
  156. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input-group/hlm-input-group-text.ts +14 -0
  157. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input-group/hlm-input-group.ts +18 -0
  158. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/input-group/index.ts +19 -0
  159. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/label/hlm-label.ts +17 -0
  160. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/label/index.ts +5 -0
  161. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/label/label.html +11 -0
  162. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-numbered-pagination-query-params.ts +191 -0
  163. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-numbered-pagination.ts +290 -0
  164. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination-content.ts +12 -0
  165. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination-ellipsis.ts +27 -0
  166. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination-item.ts +7 -0
  167. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination-link.ts +51 -0
  168. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination-next.ts +65 -0
  169. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination-previous.ts +65 -0
  170. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/hlm-pagination.ts +19 -0
  171. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/pagination/index.ts +31 -0
  172. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover-content.ts +25 -0
  173. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover-description.ts +12 -0
  174. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover-header.ts +12 -0
  175. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover-portal.ts +8 -0
  176. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover-title.ts +12 -0
  177. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover-trigger.ts +14 -0
  178. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/hlm-popover.ts +23 -0
  179. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/popover/index.ts +25 -0
  180. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-content.ts +44 -0
  181. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-group.ts +14 -0
  182. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-item.ts +36 -0
  183. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-label.ts +14 -0
  184. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-multiple.ts +37 -0
  185. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-placeholder.ts +17 -0
  186. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-portal.ts +8 -0
  187. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-scroll-down.ts +22 -0
  188. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-scroll-up.ts +22 -0
  189. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-separator.ts +14 -0
  190. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-trigger.ts +59 -0
  191. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-value-template.ts +5 -0
  192. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-value.ts +18 -0
  193. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-values-content.ts +9 -0
  194. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select-values.ts +5 -0
  195. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/hlm-select.ts +37 -0
  196. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/select/index.ts +52 -0
  197. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/separator/hlm-separator.ts +19 -0
  198. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/separator/index.ts +5 -0
  199. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/skeleton/hlm-skeleton.ts +14 -0
  200. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/skeleton/index.ts +5 -0
  201. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/spinner/hlm-spinner.ts +26 -0
  202. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/spinner/index.ts +5 -0
  203. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/utils/hlm.ts +313 -0
  204. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/utils/index.ts +2 -0
  205. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/shared/utils/provide-spartan-hlm.ts +34 -0
  206. package/dist/force-app/main/default/uiBundles/angularintapp/src/index.html +0 -1
  207. package/dist/force-app/main/default/uiBundles/angularintapp/src/{styles.scss → styles.css} +7 -38
  208. package/dist/force-app/main/default/uiBundles/angularintapp/tsconfig.json +4 -1
  209. package/dist/package-lock.json +2 -2
  210. package/dist/package.json +1 -1
  211. package/package.json +1 -1
  212. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/_field-size.scss +0 -42
  213. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/button/button.scss +0 -112
  214. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/card/card.scss +0 -34
  215. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/date-picker/date-picker.scss +0 -36
  216. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/date-range-picker/date-range-picker.scss +0 -33
  217. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/input/input.scss +0 -35
  218. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/label/label.html +0 -3
  219. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/select/select.scss +0 -35
  220. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/separator/separator.html +0 -1
  221. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/separator/separator.scss +0 -23
  222. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/skeleton/skeleton.html +0 -1
  223. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/components/ui/skeleton/skeleton.scss +0 -28
  224. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/account-detail/account-detail-page.scss +0 -7
  225. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/home/home-page.html +0 -18
  226. package/dist/force-app/main/default/uiBundles/angularintapp/src/app/pages/home/home-page.ts +0 -47
  227. package/dist/force-app/main/default/uiBundles/angularintapp/src/theme.scss +0 -39
@@ -3,54 +3,29 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import {
7
- booleanAttribute,
8
- ChangeDetectionStrategy,
9
- Component,
10
- computed,
11
- input,
12
- } from '@angular/core';
13
- import { MatDivider } from '@angular/material/divider';
6
+ import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';
7
+ import { BrnSeparator } from '@spartan-ng/brain/separator';
8
+ import { hlmSeparatorClass } from '@spartan-ng/styles/separator';
9
+ import { classes } from '@spartan-ng/styles/utils';
14
10
 
15
- /** Layout axis of the separator line. */
16
11
  export type AppSeparatorOrientation = 'horizontal' | 'vertical';
17
12
 
18
- const BASE_CLASSES = 'shrink-0';
19
- const ORIENTATION_CLASSES: Record<AppSeparatorOrientation, string> = {
20
- horizontal: 'block w-full',
21
- vertical: 'self-stretch',
22
- };
23
-
24
- /**
25
- * Divider built on Material's `mat-divider`. `decorative` (default) hides the
26
- * host from assistive tech (`role="none"`); when false it exposes
27
- * `role="separator"` + `aria-orientation`. The inner `mat-divider` is marked
28
- * `role="presentation"` so it never announces a duplicate separator.
29
- */
30
13
  @Component({
31
14
  selector: 'app-separator',
32
15
  changeDetection: ChangeDetectionStrategy.OnPush,
33
- imports: [MatDivider],
34
- templateUrl: './separator.html',
35
- styleUrl: './separator.scss',
16
+ hostDirectives: [{ directive: BrnSeparator, inputs: ['orientation', 'decorative'] }],
36
17
  host: {
37
18
  'data-slot': 'separator',
38
- '[attr.data-orientation]': 'orientation()',
39
- '[attr.role]': "decorative() ? 'none' : 'separator'",
40
- '[attr.aria-orientation]':
41
- "decorative() ? null : (orientation() === 'vertical' ? 'vertical' : 'horizontal')",
42
- '[class]': 'hostClass()',
43
19
  },
20
+ template: '',
44
21
  })
45
22
  export class SeparatorComponent {
46
23
  readonly orientation = input<AppSeparatorOrientation>('horizontal');
47
24
  readonly decorative = input(true, { transform: booleanAttribute });
48
- /** Adds Material's horizontal inset margin so the line doesn't run edge-to-edge. */
49
- readonly inset = input(false, { transform: booleanAttribute });
50
25
 
51
- protected readonly isVertical = computed(() => this.orientation() === 'vertical');
52
-
53
- protected readonly hostClass = computed(
54
- () => `${BASE_CLASSES} ${ORIENTATION_CLASSES[this.orientation()]}`,
55
- );
26
+ constructor() {
27
+ classes(() => hlmSeparatorClass);
28
+ }
56
29
  }
30
+
31
+ export const SeparatorImports = [SeparatorComponent] as const;
@@ -4,21 +4,17 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component } from '@angular/core';
7
+ import { HlmSkeleton } from '@spartan-ng/styles/skeleton';
7
8
 
8
- /**
9
- * Loading skeleton — a pulsing block sized by host `class` utilities (e.g.
10
- * `class="h-4 w-32"`); it has no intrinsic size, so always set width/height.
11
- * `aria-hidden`, so announce loading via the container's `aria-busy`.
12
- */
13
9
  @Component({
14
10
  selector: 'app-skeleton',
15
11
  changeDetection: ChangeDetectionStrategy.OnPush,
16
- templateUrl: './skeleton.html',
17
- styleUrl: './skeleton.scss',
12
+ hostDirectives: [HlmSkeleton],
18
13
  host: {
19
- 'data-slot': 'skeleton',
20
14
  'aria-hidden': 'true',
21
- class: 'bg-accent rounded-md',
22
15
  },
16
+ template: '<ng-content />',
23
17
  })
24
18
  export class SkeletonComponent {}
19
+
20
+ export const SkeletonImports = [SkeletonComponent] as const;
@@ -4,32 +4,25 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, input } from '@angular/core';
7
- import { MatProgressSpinnerModule, ProgressSpinnerMode } from '@angular/material/progress-spinner';
7
+ import { HlmSpinnerImports } from '@spartan-ng/styles/spinner';
8
+ import { classes } from '@spartan-ng/styles/utils';
8
9
 
9
- /**
10
- * Thin wrapper over Material's `mat-progress-spinner`. Defaults to an
11
- * indeterminate 24px spinner. `ariaLabel` names the `role="progressbar"`.
12
- */
13
10
  @Component({
14
11
  selector: 'app-spinner',
12
+ imports: [HlmSpinnerImports],
15
13
  changeDetection: ChangeDetectionStrategy.OnPush,
16
- imports: [MatProgressSpinnerModule],
17
- template: `
18
- <mat-progress-spinner
19
- [mode]="mode()"
20
- [diameter]="diameter()"
21
- [value]="value()"
22
- [attr.aria-label]="ariaLabel()"
23
- />
24
- `,
14
+ host: {
15
+ role: 'status',
16
+ '[attr.aria-label]': 'ariaLabel()',
17
+ },
18
+ template: `<hlm-spinner />`,
25
19
  })
26
20
  export class SpinnerComponent {
27
- readonly diameter = input<number>(24);
28
- readonly mode = input<ProgressSpinnerMode>('indeterminate');
21
+ public readonly ariaLabel = input<string>('Loading', { alias: 'aria-label' });
29
22
 
30
- /** Progress value (0–100) used only when `mode` is `determinate`. */
31
- readonly value = input<number>(0);
32
-
33
- /** Accessible name announced by assistive tech. */
34
- readonly ariaLabel = input<string>('Loading', { alias: 'aria-label' });
23
+ constructor() {
24
+ classes(() => 'text-[length:--spacing(4)]');
25
+ }
35
26
  }
27
+
28
+ export const SpinnerImports = [SpinnerComponent] as const;
@@ -1,3 +1,3 @@
1
- @if (isInline()) {
1
+ @if (inline()) {
2
2
  <div #host></div>
3
3
  }
@@ -97,9 +97,6 @@ export class AgentforceConversationClientComponent {
97
97
  };
98
98
  });
99
99
 
100
- /** Whether the chat should render inline (drives the host `<div>`). */
101
- protected readonly isInline = computed(() => this.config().renderingConfig?.mode === "inline");
102
-
103
100
  constructor() {
104
101
  // Embed after the view (and any inline host `<div>`) exists in the DOM —
105
102
  // the analogue of the React `useEffect`. The service guards against
@@ -6,18 +6,8 @@
6
6
  <li class="inline-flex items-center gap-1.5">
7
7
  <a [routerLink]="'/'" class="hover:text-foreground transition-colors">{{ homeLabel() }}</a>
8
8
  </li>
9
- <li aria-hidden="true" class="[&>svg]:size-3.5">
10
- <svg
11
- xmlns="http://www.w3.org/2000/svg"
12
- viewBox="0 0 24 24"
13
- fill="none"
14
- stroke="currentColor"
15
- stroke-width="2"
16
- stroke-linecap="round"
17
- stroke-linejoin="round"
18
- >
19
- <polyline points="9 18 15 12 9 6" />
20
- </svg>
9
+ <li aria-hidden="true">
10
+ <app-icon name="chevronRight" size="14px" class="flex" />
21
11
  </li>
22
12
  } @if (isDetailView()) {
23
13
  <li class="inline-flex items-center gap-1.5">
@@ -25,18 +15,8 @@
25
15
  >{{ listLabel() }}</a
26
16
  >
27
17
  </li>
28
- <li aria-hidden="true" class="[&>svg]:size-3.5">
29
- <svg
30
- xmlns="http://www.w3.org/2000/svg"
31
- viewBox="0 0 24 24"
32
- fill="none"
33
- stroke="currentColor"
34
- stroke-width="2"
35
- stroke-linecap="round"
36
- stroke-linejoin="round"
37
- >
38
- <polyline points="9 18 15 12 9 6" />
39
- </svg>
18
+ <li aria-hidden="true">
19
+ <app-icon name="chevronRight" size="14px" class="flex" />
40
20
  </li>
41
21
  <li class="inline-flex items-center gap-1.5">
42
22
  @if (loading() && !recordName()) {
@@ -5,36 +5,23 @@
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core";
7
7
  import { RouterLink } from "@angular/router";
8
+ import { IconComponent } from "../../../components/ui/icon/icon";
8
9
  import { SkeletonComponent } from "../../../components/ui/skeleton/skeleton";
9
10
 
10
- /**
11
- * Object-search breadcrumb — Home > Records list > (optional) Record name.
12
- *
13
- * Mirrors the React `ObjectBreadcrumb`. Renders the list-only crumb by default
14
- * and switches to the detail-view crumb (with record name + skeleton fallback)
15
- * as soon as `loading` or `recordName` is set. Uses Angular `routerLink` where
16
- * the React version uses `react-router`'s `Link`.
17
- */
11
+ /** Object-search breadcrumb — Home > Records list > (optional) Record name. */
18
12
  @Component({
19
13
  selector: "app-object-breadcrumb",
20
14
  changeDetection: ChangeDetectionStrategy.OnPush,
21
- imports: [RouterLink, SkeletonComponent],
15
+ imports: [RouterLink, IconComponent, SkeletonComponent],
22
16
  templateUrl: "./breadcrumb.html",
23
17
  })
24
18
  export class ObjectBreadcrumbComponent {
25
- /** Router path for the object list view (e.g. `/accounts`). */
26
19
  readonly listPath = input.required<string>();
27
- /** Label for the list crumb (e.g. `Accounts`). */
28
20
  readonly listLabel = input.required<string>();
29
- /** Record name for the detail-view leaf crumb; omit for list-only view. */
30
21
  readonly recordName = input<string | undefined>(undefined);
31
- /** Show a skeleton in the leaf crumb while the record is loading. */
32
22
  readonly loading = input<boolean>(false);
33
- /** Prepend a Home crumb (default `true`). */
34
23
  readonly includeHome = input<boolean>(true);
35
- /** Label for the Home crumb (default `Home`). */
36
24
  readonly homeLabel = input<string>("Home");
37
25
 
38
- /** `true` when the crumb should render list + record leaves. */
39
26
  protected readonly isDetailView = computed(() => this.loading() || !!this.recordName());
40
27
  }
@@ -85,7 +85,7 @@ export class DateFilterComponent {
85
85
  if (date) this.emit(op, date);
86
86
  }
87
87
 
88
- protected onDateChange(date: Date | null): void {
88
+ protected onDateChange(date: Date | null | undefined): void {
89
89
  const cfg = this.config();
90
90
  if (!date) {
91
91
  this.state.removeFilter(cfg.field);
@@ -1,6 +1,7 @@
1
- <app-filter-field-wrapper [label]="config().label" [helpText]="config().helpText">
1
+ <app-filter-field-wrapper [helpText]="config().helpText">
2
2
  <app-date-range-picker
3
3
  class="w-full"
4
+ [label]="config().label"
4
5
  startPlaceholder="Start"
5
6
  endPlaceholder="End"
6
7
  [readonly]="true"
@@ -4,8 +4,6 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
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/date-range-picker/..., three levels up.
9
7
  import {
10
8
  DateRange,
11
9
  DateRangePickerComponent,
@@ -16,13 +14,8 @@ import { toDate, toDateString } from "./date-filter";
16
14
  import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
17
15
 
18
16
  /**
19
- * Date range filter — a single two-ended range picker. Emits a `daterange`
20
- * (or `datetimerange`) filter with `min` / `max` as `YYYY-MM-DD` strings; the
21
- * filter builder wires each end into a `gte` / `lte` clause.
22
- *
23
- * Thin bridge over the base `app-date-range-picker` (Material's
24
- * `mat-date-range-picker`): it maps the picker's `DateRange<Date>` value to and
25
- * from the `min` / `max` string split the filter state stores.
17
+ * Date range filter — a two-ended range picker. Emits a `daterange` (or
18
+ * `datetimerange`) filter with `min` / `max` as `YYYY-MM-DD` strings.
26
19
  */
27
20
  @Component({
28
21
  selector: "app-date-range-filter",
@@ -33,17 +26,15 @@ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
33
26
  export class DateRangeFilterComponent {
34
27
  private readonly state = inject(ObjectSearchStateService);
35
28
 
36
- /** Field config: `field`, `label`, `helpText`, ... */
37
29
  readonly config = input.required<FilterFieldConfig>();
38
- /** Underlying filter type — `'daterange'` (default) or `'datetimerange'`. */
39
30
  readonly filterType = input<FilterFieldType>("daterange");
40
31
 
41
32
  private readonly active = computed(() => this.state.filterFor(this.config().field));
42
33
 
43
- /** The active filter's `min` / `max` strings surfaced as a picker range. */
44
- protected readonly range = computed<DateRange<Date>>(
45
- () => new DateRange(toDate(this.active()?.min), toDate(this.active()?.max)),
46
- );
34
+ protected readonly range = computed<DateRange<Date>>(() => ({
35
+ start: toDate(this.active()?.min),
36
+ end: toDate(this.active()?.max),
37
+ }));
47
38
 
48
39
  /** Cap the picker at today when the field can't hold a future date. */
49
40
  protected readonly maxDate = computed<Date | null>(() =>
@@ -1,5 +1,7 @@
1
1
  <div class="space-y-1">
2
+ @if (label()) {
2
3
  <app-label [for]="htmlFor()">{{ label() }}</app-label>
4
+ }
3
5
  <ng-content />
4
6
  <div class="min-h-4">
5
7
  @if (error(); as err) {
@@ -4,20 +4,9 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, 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/label/..., three levels up from this
9
- // filter folder (app/object-search/filters/ -> app/components/ui/).
7
+ // Post-compose, this lands 3 levels up at app/components/ui/label/__inherit__label.
10
8
  import { LabelComponent } from "../../../components/ui/label/label";
11
9
 
12
- /**
13
- * Standard label + control + help/error scaffold shared by every filter
14
- * component (the Angular analogue of the React `FilterFieldWrapper`).
15
- *
16
- * The control itself is content-projected so each filter can supply the
17
- * primitive that fits its data type (input, select, popover, date picker, ...)
18
- * while the wrapper keeps the layout, label, and error/help affordances
19
- * consistent across the search page.
20
- */
21
10
  @Component({
22
11
  selector: "app-filter-field-wrapper",
23
12
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -25,12 +14,8 @@ import { LabelComponent } from "../../../components/ui/label/label";
25
14
  templateUrl: "./filter-field-wrapper.html",
26
15
  })
27
16
  export class FilterFieldWrapperComponent {
28
- /** Visible field label rendered above the control. */
29
- readonly label = input.required<string>();
30
- /** Optional `for` attribute forwarded to the underlying `<label>`. */
17
+ readonly label = input<string>("");
31
18
  readonly htmlFor = input<string | null>(null);
32
- /** Advisory copy rendered below the control when there is no error. */
33
19
  readonly helpText = input<string | undefined>(undefined);
34
- /** Validation message; when set, replaces the help text. */
35
20
  readonly error = input<string | undefined>(undefined);
36
21
  }
@@ -1,6 +1,7 @@
1
- <app-filter-field-wrapper [label]="config().label" [helpText]="config().helpText">
1
+ <app-filter-field-wrapper [helpText]="config().helpText">
2
2
  <app-select
3
3
  multiple
4
+ [label]="config().label"
4
5
  [size]="size()"
5
6
  [options]="config().options ?? []"
6
7
  [placeholder]="placeholder()"
@@ -16,11 +16,6 @@ import {
16
16
  import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
17
17
  import { Subject } from "rxjs";
18
18
  import { debounceTime } from "rxjs/operators";
19
- import { MatInputModule } from "@angular/material/input";
20
- import { MatFormFieldModule } from "@angular/material/form-field";
21
- import { FormsModule } from "@angular/forms";
22
- // Base-app UI wrapper, inherited (not recreated) by this feature. Post-compose
23
- // it lands at uiBundles/<target>/src/app/components/ui/input/..., three levels up.
24
19
  import { InputComponent } from "../../../components/ui/input/input";
25
20
  import { ObjectSearchStateService } from "../object-search-state.service";
26
21
  import { FILTER_DEBOUNCE_MS } from "../utils/debounce";
@@ -30,34 +25,21 @@ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
30
25
  /**
31
26
  * Numeric range filter — paired `min` / `max` inputs whose committed values are
32
27
  * written as strings on a `type: 'numeric'` filter (numeric coercion happens
33
- * in `buildSingleFilter`).
34
- *
35
- * Local signals drive the inputs immediately; a trailing debounce commits the
36
- * pair, but only when the range is self-consistent (`min <= max`) and within
37
- * `boundMin` / `boundMax` if provided — an inverted or out-of-bounds pair
38
- * shows the same inline error the React reference renders and skips the write.
28
+ * in `buildSingleFilter`). A trailing debounce commits the pair, skipping
29
+ * writes when the range is inverted or out of `boundMin` / `boundMax`.
39
30
  */
40
31
  @Component({
41
32
  selector: "app-numeric-range-filter",
42
33
  changeDetection: ChangeDetectionStrategy.OnPush,
43
- imports: [
44
- InputComponent,
45
- FilterFieldWrapperComponent,
46
- FormsModule,
47
- MatFormFieldModule,
48
- MatInputModule,
49
- ],
34
+ imports: [InputComponent, FilterFieldWrapperComponent],
50
35
  templateUrl: "./numeric-range-filter.html",
51
36
  })
52
37
  export class NumericRangeFilterComponent {
53
38
  private readonly state = inject(ObjectSearchStateService);
54
39
  private readonly destroyRef = inject(DestroyRef);
55
40
 
56
- /** Field config: `field`, `label`, `helpText`, ... */
57
41
  readonly config = input.required<FilterFieldConfig>();
58
- /** Optional lower bound accepted by the field (used for validation only). */
59
42
  readonly boundMin = input<number | undefined>(undefined);
60
- /** Optional upper bound accepted by the field (used for validation only). */
61
43
  readonly boundMax = input<number | undefined>(undefined);
62
44
 
63
45
  protected readonly localMin = signal<string>("");
@@ -1,6 +1,6 @@
1
- <app-filter-field-wrapper [label]="config().label" [htmlFor]="inputId()">
2
- <app-input
3
- type="search"
1
+ <app-filter-field-wrapper [label]="config().label" [htmlFor]="fieldId()">
2
+ <app-search-bar
3
+ [inputId]="fieldId()"
4
4
  [placeholder]="config().placeholder ?? 'Search...'"
5
5
  [value]="localValue()"
6
6
  (valueChange)="onValueChange($event)"
@@ -6,6 +6,7 @@
6
6
  import {
7
7
  ChangeDetectionStrategy,
8
8
  Component,
9
+ computed,
9
10
  DestroyRef,
10
11
  effect,
11
12
  inject,
@@ -15,37 +16,33 @@ import {
15
16
  import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
16
17
  import { Subject } from "rxjs";
17
18
  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";
19
+ import { SearchBarComponent } from "../search-bar/search-bar";
21
20
  import { ObjectSearchStateService } from "../object-search-state.service";
22
21
  import { FILTER_DEBOUNCE_MS } from "../utils/debounce";
23
22
  import type { FilterFieldConfig } from "../utils/filter-utils";
24
23
  import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
25
24
 
26
25
  /**
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.
26
+ * Multi-field search filter — a debounced input applied via `like %value%`
27
+ * across every field named in `config.searchFields` (combined with a
28
+ * top-level `or`, see {@link buildFilter}).
33
29
  */
34
30
  @Component({
35
31
  selector: "app-search-filter",
36
32
  changeDetection: ChangeDetectionStrategy.OnPush,
37
- imports: [InputComponent, FilterFieldWrapperComponent],
33
+ imports: [SearchBarComponent, FilterFieldWrapperComponent],
38
34
  templateUrl: "./search-filter.html",
39
35
  })
40
36
  export class SearchFilterComponent {
41
37
  private readonly state = inject(ObjectSearchStateService);
42
38
  private readonly destroyRef = inject(DestroyRef);
43
39
 
44
- /** Field config: `field`, `label`, `placeholder`, `searchFields`, ... */
45
40
  readonly config = input.required<FilterFieldConfig>();
46
41
 
42
+ // Ties the wrapper's <label for> to the search input.
43
+ protected readonly fieldId = computed(() => `filter-${this.config().field}`);
44
+
47
45
  protected readonly localValue = signal<string>("");
48
- protected readonly inputId = signal<string>("");
49
46
  private readonly commit$ = new Subject<string>();
50
47
 
51
48
  constructor() {
@@ -55,7 +52,6 @@ export class SearchFilterComponent {
55
52
 
56
53
  effect(() => {
57
54
  const cfg = this.config();
58
- this.inputId.set(`filter-${cfg.field}`);
59
55
  const external = this.state.filterFor(cfg.field)?.value ?? "";
60
56
  this.localValue.set(external);
61
57
  });
@@ -1,9 +1,6 @@
1
- <app-filter-field-wrapper
2
- [label]="config().label"
3
- [htmlFor]="inputId()"
4
- [helpText]="config().helpText"
5
- >
1
+ <app-filter-field-wrapper [helpText]="config().helpText">
6
2
  <app-select
3
+ [label]="config().label"
7
4
  [placeholder]="'Select ' + config().label.toLowerCase()"
8
5
  [options]="options()"
9
6
  [value]="currentValue()"
@@ -4,8 +4,6 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
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
7
  import {
10
8
  SelectComponent,
11
9
  type AppSelectOption,
@@ -14,13 +12,7 @@ import { ObjectSearchStateService } from "../object-search-state.service";
14
12
  import type { FilterFieldConfig } from "../utils/filter-utils";
15
13
  import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
16
14
 
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
- */
15
+ // A leading "All" entry (empty value) clears the filter.
24
16
  const ALL_VALUE = "";
25
17
 
26
18
  @Component({
@@ -32,19 +24,13 @@ const ALL_VALUE = "";
32
24
  export class SelectFilterComponent {
33
25
  private readonly state = inject(ObjectSearchStateService);
34
26
 
35
- /** Field config: `field`, `label`, `options`, `helpText`, ... */
36
27
  readonly config = input.required<FilterFieldConfig>();
37
28
 
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
29
  protected readonly options = computed<readonly AppSelectOption[]>(() => [
43
30
  { value: ALL_VALUE, label: "All" },
44
31
  ...(this.config().options ?? []),
45
32
  ]);
46
33
 
47
- /** Current selection, reading through to shared state so URL changes reflect. */
48
34
  protected readonly currentValue = computed(
49
35
  () => this.state.filterFor(this.config().field)?.value ?? ALL_VALUE,
50
36
  );
@@ -1,10 +1,7 @@
1
- <app-filter-field-wrapper
2
- [label]="config().label"
3
- [htmlFor]="inputId()"
4
- [helpText]="config().helpText"
5
- >
1
+ <app-filter-field-wrapper [helpText]="config().helpText">
6
2
  <app-input
7
3
  type="text"
4
+ [label]="config().label"
8
5
  [placeholder]="config().placeholder ?? 'Filter by ' + config().label.toLowerCase() + '...'"
9
6
  [value]="localValue()"
10
7
  (valueChange)="onValueChange($event)"
@@ -15,8 +15,6 @@ import {
15
15
  import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
16
16
  import { Subject } from "rxjs";
17
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
18
  import { InputComponent } from "../../../components/ui/input/input";
21
19
  import { ObjectSearchStateService } from "../object-search-state.service";
22
20
  import { FILTER_DEBOUNCE_MS } from "../utils/debounce";
@@ -26,11 +24,8 @@ import { FilterFieldWrapperComponent } from "./filter-field-wrapper";
26
24
  /**
27
25
  * Text filter — free-text input that writes a `like %value%` clause via
28
26
  * {@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.
27
+ * signal immediately and flush to shared state on a
28
+ * {@link FILTER_DEBOUNCE_MS}ms trailing debounce.
34
29
  */
35
30
  @Component({
36
31
  selector: "app-text-filter",
@@ -42,16 +37,9 @@ export class TextFilterComponent {
42
37
  private readonly state = inject(ObjectSearchStateService);
43
38
  private readonly destroyRef = inject(DestroyRef);
44
39
 
45
- /** Field config: `field`, `label`, `placeholder`, `helpText`, ... */
46
40
  readonly config = input.required<FilterFieldConfig>();
47
41
 
48
- /** Local (uncommitted) value that drives the input while the user is typing. */
49
42
  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
43
  private readonly commit$ = new Subject<string>();
56
44
 
57
45
  constructor() {
@@ -59,11 +47,9 @@ export class TextFilterComponent {
59
47
  .pipe(debounceTime(FILTER_DEBOUNCE_MS), takeUntilDestroyed(this.destroyRef))
60
48
  .subscribe((v) => this.commit(v));
61
49
 
62
- // Sync the input with the shared state (URL restore, reset-all, ...).
63
- // Mirrors the React "reset local when external changes" pattern.
50
+ // Sync the input with shared state (URL restore, reset-all, ...).
64
51
  effect(() => {
65
52
  const cfg = this.config();
66
- this.inputId.set(`filter-${cfg.field}`);
67
53
  const external = this.state.filterFor(cfg.field)?.value ?? "";
68
54
  this.localValue.set(external);
69
55
  });