@salesforce/ui-bundle-template-app-angular-template-b2x 11.60.0 → 11.62.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 (232) hide show
  1. package/dist/CHANGELOG.md +16 -0
  2. package/dist/force-app/main/default/uiBundles/angularextapp/angular.json +2 -7
  3. package/dist/force-app/main/default/uiBundles/angularextapp/components.json +6 -0
  4. package/dist/force-app/main/default/uiBundles/angularextapp/eslint.config.js +9 -1
  5. package/dist/force-app/main/default/uiBundles/angularextapp/package.json +16 -11
  6. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.config.ts +4 -6
  7. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.routes.ts +2 -2
  8. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.html +9 -13
  9. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.ts +16 -28
  10. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.html +19 -10
  11. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.ts +34 -25
  12. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.ts +40 -50
  13. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.html +38 -10
  14. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.ts +6 -11
  15. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.html +17 -22
  16. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.ts +29 -21
  17. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.html +16 -30
  18. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.ts +39 -36
  19. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.html +13 -30
  20. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.ts +6 -21
  21. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
  22. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
  23. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.html +5 -11
  24. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.ts +10 -18
  25. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field-appearance.ts +8 -0
  26. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/icon/icon.ts +62 -0
  27. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.html +32 -17
  28. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.ts +57 -14
  29. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.ts +8 -4
  30. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.html +74 -10
  31. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.ts +74 -18
  32. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/types.ts +13 -0
  33. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.html +10 -38
  34. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.ts +12 -15
  35. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.html +34 -22
  36. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.ts +25 -34
  37. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.ts +11 -36
  38. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.ts +5 -9
  39. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/spinner/spinner.ts +14 -21
  40. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/auth-form/auth-form.html +2 -3
  41. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.html +31 -21
  42. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.ts +6 -18
  43. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/session/session.html +2 -2
  44. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.html +8 -4
  45. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.ts +4 -16
  46. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.html +4 -24
  47. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.ts +3 -16
  48. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-filter.ts +1 -1
  49. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.html +2 -1
  50. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.ts +6 -15
  51. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.html +2 -0
  52. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.ts +2 -17
  53. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/multi-select-filter.html +2 -1
  54. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/numeric-range-filter.ts +3 -21
  55. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.html +3 -3
  56. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.ts +9 -13
  57. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.html +2 -5
  58. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.ts +1 -15
  59. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.html +2 -5
  60. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.ts +3 -17
  61. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/pagination/pagination.ts +4 -20
  62. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.html +10 -59
  63. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.ts +13 -93
  64. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.html +3 -29
  65. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.ts +5 -12
  66. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.html +1 -23
  67. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.ts +3 -23
  68. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.html +1 -19
  69. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.ts +8 -36
  70. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.html +15 -4
  71. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.spec.ts +8 -6
  72. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.ts +56 -4
  73. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/index.ts +16 -0
  74. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-action.ts +14 -0
  75. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-description.ts +17 -0
  76. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-title.ts +17 -0
  77. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert.ts +35 -0
  78. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/index.ts +6 -0
  79. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/lib/hlm-button.token.ts +22 -0
  80. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/lib/hlm-button.ts +72 -0
  81. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/index.ts +16 -0
  82. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar-multi.ts +195 -0
  83. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar-range.ts +194 -0
  84. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar.ts +189 -0
  85. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-month-year-calendar.ts +119 -0
  86. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/index.ts +28 -0
  87. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-action.ts +12 -0
  88. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-avatar.ts +14 -0
  89. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-content.ts +12 -0
  90. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-description.ts +12 -0
  91. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-footer.ts +12 -0
  92. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-header.ts +15 -0
  93. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-title.ts +12 -0
  94. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card.token.ts +19 -0
  95. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card.ts +22 -0
  96. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/index.ts +13 -0
  97. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-content.ts +14 -0
  98. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-trigger.ts +9 -0
  99. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible.ts +15 -0
  100. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/index.ts +38 -0
  101. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-multi-input.ts +104 -0
  102. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-anchor.ts +23 -0
  103. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-input.ts +118 -0
  104. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.token.ts +109 -0
  105. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.ts +220 -0
  106. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-trigger.ts +104 -0
  107. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.token.ts +69 -0
  108. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.ts +203 -0
  109. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-input.ts +120 -0
  110. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.token.ts +86 -0
  111. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.ts +252 -0
  112. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-input.ts +105 -0
  113. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.token.ts +89 -0
  114. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.ts +196 -0
  115. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/index.ts +35 -0
  116. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-close.ts +9 -0
  117. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-content.ts +74 -0
  118. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-description.ts +17 -0
  119. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-footer.ts +15 -0
  120. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-header.ts +12 -0
  121. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-overlay.ts +27 -0
  122. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-portal.ts +8 -0
  123. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-title.ts +14 -0
  124. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-trigger.ts +14 -0
  125. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog.service.ts +46 -0
  126. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog.ts +24 -0
  127. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/index.ts +49 -0
  128. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  129. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox.ts +54 -0
  130. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  131. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-group.ts +14 -0
  132. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  133. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item.ts +42 -0
  134. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-label.ts +20 -0
  135. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio-indicator.ts +21 -0
  136. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio.ts +49 -0
  137. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-separator.ts +12 -0
  138. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-shortcut.ts +15 -0
  139. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub-trigger.ts +52 -0
  140. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub.ts +53 -0
  141. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-token.ts +26 -0
  142. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-trigger.ts +46 -0
  143. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu.ts +57 -0
  144. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/index.ts +34 -0
  145. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-content.ts +12 -0
  146. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-description.ts +53 -0
  147. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-error.ts +100 -0
  148. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-group.ts +15 -0
  149. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-label.ts +17 -0
  150. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-legend.ts +19 -0
  151. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-separator.ts +24 -0
  152. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-set.ts +15 -0
  153. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-title.ts +15 -0
  154. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field.ts +47 -0
  155. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input/src/index.ts +5 -0
  156. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input/src/lib/hlm-input.ts +21 -0
  157. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/index.ts +19 -0
  158. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-addon.ts +40 -0
  159. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-button.ts +47 -0
  160. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-input.ts +17 -0
  161. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-text.ts +14 -0
  162. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group.ts +18 -0
  163. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/label.html +11 -0
  164. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/src/index.ts +5 -0
  165. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/src/lib/hlm-label.ts +17 -0
  166. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/index.ts +31 -0
  167. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination-query-params.ts +191 -0
  168. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination.ts +290 -0
  169. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-content.ts +12 -0
  170. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-ellipsis.ts +27 -0
  171. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-item.ts +7 -0
  172. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-link.ts +51 -0
  173. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-next.ts +65 -0
  174. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-previous.ts +65 -0
  175. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination.ts +19 -0
  176. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/index.ts +25 -0
  177. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-content.ts +25 -0
  178. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-description.ts +12 -0
  179. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-header.ts +12 -0
  180. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-portal.ts +8 -0
  181. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-title.ts +12 -0
  182. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-trigger.ts +14 -0
  183. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover.ts +23 -0
  184. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/index.ts +52 -0
  185. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-content.ts +44 -0
  186. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-group.ts +14 -0
  187. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-item.ts +36 -0
  188. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-label.ts +14 -0
  189. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-multiple.ts +37 -0
  190. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-placeholder.ts +17 -0
  191. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-portal.ts +8 -0
  192. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-scroll-down.ts +22 -0
  193. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-scroll-up.ts +22 -0
  194. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-separator.ts +14 -0
  195. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-trigger.ts +59 -0
  196. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-value-template.ts +5 -0
  197. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-value.ts +18 -0
  198. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-values-content.ts +9 -0
  199. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-values.ts +5 -0
  200. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select.ts +37 -0
  201. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/separator/src/index.ts +5 -0
  202. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/separator/src/lib/hlm-separator.ts +19 -0
  203. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/skeleton/src/index.ts +5 -0
  204. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/skeleton/src/lib/hlm-skeleton.ts +14 -0
  205. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/spinner/src/index.ts +5 -0
  206. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/spinner/src/lib/hlm-spinner.ts +26 -0
  207. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/index.ts +2 -0
  208. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/lib/hlm.ts +313 -0
  209. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/lib/provide-spartan-hlm.ts +34 -0
  210. package/dist/force-app/main/default/uiBundles/angularextapp/src/index.html +0 -1
  211. package/dist/force-app/main/default/uiBundles/angularextapp/src/{styles.scss → styles.css} +7 -38
  212. package/dist/force-app/main/default/uiBundles/angularextapp/tsconfig.json +4 -1
  213. package/dist/package-lock.json +2 -2
  214. package/dist/package.json +1 -1
  215. package/package.json +1 -1
  216. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/_field-size.scss +0 -42
  217. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.scss +0 -112
  218. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.scss +0 -34
  219. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.scss +0 -36
  220. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.scss +0 -33
  221. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.scss +0 -35
  222. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.html +0 -3
  223. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.scss +0 -35
  224. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.html +0 -1
  225. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.scss +0 -23
  226. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.html +0 -1
  227. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.scss +0 -28
  228. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.scss +0 -17
  229. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.scss +0 -7
  230. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.html +0 -18
  231. package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.ts +0 -47
  232. package/dist/force-app/main/default/uiBundles/angularextapp/src/theme.scss +0 -39
@@ -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
  });
@@ -4,20 +4,14 @@
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, inject, input } from "@angular/core";
7
- import type { PageEvent } from "@angular/material/paginator";
8
7
  import { PaginatorComponent } from "../../../components/ui/paginator/paginator";
8
+ import type { PageEvent } from "../../../components/ui/paginator/types";
9
9
  import { ObjectSearchStateService } from "../object-search-state.service";
10
10
 
11
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.
12
+ * Cursor-pagination bridge. Feeds shared cursor state into {@link PaginatorComponent}
13
+ * and translates its offset-style `(page)` event back into the cursor walk the
14
+ * state service understands.
21
15
  */
22
16
  @Component({
23
17
  selector: "app-pagination-controls",
@@ -26,26 +20,16 @@ import { ObjectSearchStateService } from "../object-search-state.service";
26
20
  templateUrl: "./pagination.html",
27
21
  })
28
22
  export class PaginationControlsComponent {
29
- /** Total row count from the latest fetch; drives the paginator's range label. */
30
23
  readonly totalCount = input<number | undefined>(undefined);
31
- /** Whether the API reports another page after the current one. */
32
24
  readonly hasNextPage = input<boolean>(false);
33
- /** `endCursor` from the latest page-info; forwarded to `goToNextPage`. */
34
25
  readonly endCursor = input<string | undefined>(undefined);
35
- /** Allowed page-size choices. */
36
26
  readonly pageSizeOptions = input.required<readonly number[]>();
37
- /** Disable navigation and the size select (e.g. while loading). */
38
27
  readonly disabled = input<boolean>(false);
39
28
 
40
29
  private readonly state = inject(ObjectSearchStateService);
41
30
  protected readonly pageIndex = this.state.pageIndex;
42
31
  protected readonly pageSize = this.state.pageSize;
43
32
 
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
33
  protected onPage(event: PageEvent): void {
50
34
  if (event.pageSize !== this.pageSize()) {
51
35
  this.state.setPageSize(event.pageSize);
@@ -1,59 +1,10 @@
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>
1
+ <app-input
2
+ class="block"
3
+ type="search"
4
+ icon="search"
5
+ [label]="label()"
6
+ [placeholder]="placeholder()"
7
+ [ariaLabel]="ariaLabel()"
8
+ [id]="inputId()"
9
+ [(value)]="value"
10
+ />
@@ -3,106 +3,26 @@
3
3
  * All rights reserved.
4
4
  * For full license text, see the LICENSE.txt file
5
5
  */
6
- import {
7
- ChangeDetectionStrategy,
8
- Component,
9
- computed,
10
- DestroyRef,
11
- inject,
12
- input,
13
- type OnInit,
14
- signal,
15
- } from "@angular/core";
16
- import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
17
- import { debounceTime } from "rxjs/operators";
18
- import { ButtonComponent } from "../../../components/ui/button/button";
6
+ import { ChangeDetectionStrategy, Component, input, model } from "@angular/core";
19
7
  import { InputComponent } from "../../../components/ui/input/input";
20
- import { PopoverComponent } from "../../../components/ui/popover/popover";
21
- import { ObjectSearchStateService } from "../object-search-state.service";
22
- import type { FilterFieldConfig } from "../utils/filter-utils";
23
-
24
- /** How long to wait after the last keystroke before writing to state. */
25
- const SEARCH_DEBOUNCE_MS = 300;
26
8
 
27
9
  /**
28
- * Search-bar header for an object-search page: a debounced text input bound to
29
- * the `search` filter, plus an optional filter popover that content-projects
30
- * the sibling filter components (owned by the filters wave).
31
- *
32
- * Mirrors the React `SearchBar`, with the composed additions from the ground-
33
- * truth example page (filter panel toggle). Filter components are NOT imported
34
- * here — the hosting page projects them via the `[filters]` slot so the
35
- * feature can pick which filters it renders.
36
- *
37
- * ## Usage
38
- * ```html
39
- * <app-search-bar [searchConfig]="searchCfg" [filterConfigs]="filterCfgs">
40
- * <div filters>
41
- * <app-text-filter .../>
42
- * <app-select-filter .../>
43
- * </div>
44
- * </app-search-bar>
45
- * ```
10
+ * Presentational search box: a text input with a leading search icon inside
11
+ * its border, purely controlled via `value` with no search state of its own.
12
+ * Reused by the Home landing form and by `app-search-filter` (which adds the
13
+ * debounce + shared-state wiring around it).
46
14
  */
47
15
  @Component({
48
16
  selector: "app-search-bar",
49
17
  changeDetection: ChangeDetectionStrategy.OnPush,
50
- imports: [ButtonComponent, InputComponent, PopoverComponent],
18
+ imports: [InputComponent],
19
+ host: { class: "flex-1 block" },
51
20
  templateUrl: "./search-bar.html",
52
21
  })
53
- export class SearchBarComponent implements OnInit {
54
- /** Config for the multi-field search filter (its label, placeholder, etc.). */
55
- readonly searchConfig = input.required<FilterFieldConfig>();
56
- /**
57
- * Configs for the filters projected into the popover. Not consumed directly
58
- * here — surfaced so the hosting page and this component agree on which
59
- * filters exist, and reserved for a future filter-count badge.
60
- */
61
- readonly filterConfigs = input<FilterFieldConfig[]>([]);
62
-
63
- private readonly state = inject(ObjectSearchStateService);
64
- private readonly destroyRef = inject(DestroyRef);
65
-
66
- /** Local, debounced mirror of the search filter's `value`. */
67
- protected readonly term = signal<string>("");
68
- protected readonly popoverOpen = signal<boolean>(false);
69
-
70
- /** Count of currently active filters minus the search itself (for the badge). */
71
- protected readonly nonSearchFilterCount = computed(
72
- () => this.state.filters().filter((f) => f.type !== "search").length,
73
- );
74
-
75
- constructor() {
76
- // Required inputs are not yet resolved in the constructor, so the search
77
- // config is read lazily inside the subscription (which emits after init).
78
- toObservable(this.term)
79
- .pipe(debounceTime(SEARCH_DEBOUNCE_MS), takeUntilDestroyed(this.destroyRef))
80
- .subscribe((value) => {
81
- const cfg = this.searchConfig();
82
- if (value) {
83
- this.state.setFilter(cfg.field, {
84
- field: cfg.field,
85
- label: cfg.label,
86
- type: cfg.type,
87
- value,
88
- });
89
- } else {
90
- this.state.removeFilter(cfg.field);
91
- }
92
- });
93
- }
94
-
95
- ngOnInit(): void {
96
- // Seed the local term from any existing search filter (deep-link support).
97
- // Done here (not the constructor) so the required `searchConfig` input is
98
- // resolved before it is read.
99
- const existing = this.state.filterFor(this.searchConfig().field);
100
- if (existing?.value) {
101
- this.term.set(existing.value);
102
- }
103
- }
104
-
105
- protected togglePopover(): void {
106
- this.popoverOpen.set(!this.popoverOpen());
107
- }
22
+ export class SearchBarComponent {
23
+ readonly value = model<string>("");
24
+ readonly placeholder = input<string>("");
25
+ readonly label = input<string>("");
26
+ readonly ariaLabel = input<string>("");
27
+ readonly inputId = input<string>("");
108
28
  }
@@ -11,39 +11,13 @@
11
11
  <app-button
12
12
  appearance="text"
13
13
  size="icon-sm"
14
- [attr.aria-label]="'Sort ' + (active.direction === 'ASC' ? 'descending' : 'ascending')"
14
+ [ariaLabel]="'Sort ' + (active.direction === 'ASC' ? 'descending' : 'ascending')"
15
15
  (clicked)="toggleDirection()"
16
16
  >
17
17
  @if (active.direction === "ASC") {
18
- <svg
19
- xmlns="http://www.w3.org/2000/svg"
20
- class="h-4 w-4"
21
- viewBox="0 0 24 24"
22
- fill="none"
23
- stroke="currentColor"
24
- stroke-width="2"
25
- stroke-linecap="round"
26
- stroke-linejoin="round"
27
- aria-hidden="true"
28
- >
29
- <path d="m5 12 7-7 7 7" />
30
- <path d="M12 19V5" />
31
- </svg>
18
+ <app-icon name="arrowUp" />
32
19
  } @else {
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="M12 5v14" />
45
- <path d="m19 12-7 7-7-7" />
46
- </svg>
20
+ <app-icon name="arrowDown" />
47
21
  }
48
22
  </app-button>
49
23
  }
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { ChangeDetectionStrategy, Component, computed, inject, input } from "@angular/core";
7
7
  import { ButtonComponent } from "../../../components/ui/button/button";
8
+ import { IconComponent } from "../../../components/ui/icon/icon";
8
9
  import {
9
10
  SelectComponent,
10
11
  type AppSelectOption,
@@ -16,36 +17,28 @@ import type { SortFieldConfig, SortState } from "../utils/sort-utils";
16
17
  const NONE_VALUE = "__none__";
17
18
 
18
19
  /**
19
- * Sort field + direction toggle. Mirrors the React `SortControl`.
20
- *
21
- * Reads `sort()` from the {@link ObjectSearchStateService} and drives changes
22
- * via `setSort`. Choosing a field applies ASC by default; the direction button
23
- * flips ASC/DESC and only appears while a sort is active. Selecting `Default`
24
- * clears the sort (`setSort(null)`).
20
+ * Sort field + direction toggle. Choosing a field applies ASC by default; the
21
+ * direction button flips ASC/DESC and only appears while a sort is active.
22
+ * Selecting `Default` clears the sort (`setSort(null)`).
25
23
  */
26
24
  @Component({
27
25
  selector: "app-sort-control",
28
26
  changeDetection: ChangeDetectionStrategy.OnPush,
29
- imports: [ButtonComponent, SelectComponent],
27
+ imports: [ButtonComponent, IconComponent, SelectComponent],
30
28
  templateUrl: "./sort-control.html",
31
29
  })
32
30
  export class SortControlComponent {
33
- /** Sortable fields to expose in the select. */
34
31
  readonly sortFields = input.required<SortFieldConfig[]>();
35
- /** Override for the leading label (default `Sort by`). */
36
32
  readonly label = input<string>("Sort by");
37
33
 
38
34
  private readonly state = inject(ObjectSearchStateService);
39
- /** Current sort state from the shared state service. */
40
35
  protected readonly sort = this.state.sort;
41
36
 
42
- /** Select options — the `Default` sentinel plus one per sortable field. */
43
37
  protected readonly options = computed<AppSelectOption[]>(() => [
44
38
  { value: NONE_VALUE, label: "Default" },
45
39
  ...this.sortFields().map((c) => ({ value: c.field, label: c.label })),
46
40
  ]);
47
41
 
48
- /** Value shown in the select — either the current field or the sentinel. */
49
42
  protected readonly selectedValue = computed(() => this.sort()?.field ?? NONE_VALUE);
50
43
 
51
44
  protected onFieldChange(field: string): void {
@@ -7,7 +7,6 @@
7
7
  />
8
8
 
9
9
  @if (loading()) {
10
- <!-- Loading state -->
11
10
  <app-skeleton class="h-8 w-56 mb-4" />
12
11
  <app-card>
13
12
  <app-card-content class="space-y-8">
@@ -36,7 +35,6 @@
36
35
  </app-card-content>
37
36
  </app-card>
38
37
  } @else if (error()) {
39
- <!-- Error state -->
40
38
  <app-alert
41
39
  variant="destructive"
42
40
  icon="error"
@@ -48,25 +46,9 @@
48
46
  <app-button appearance="outlined" (clicked)="reload()">Retry</app-button>
49
47
  </div>
50
48
  } @else if (notFound()) {
51
- <!-- Not found state -->
52
49
  <app-card>
53
50
  <app-card-content class="flex flex-col items-center justify-center py-16 text-center">
54
- <svg
55
- xmlns="http://www.w3.org/2000/svg"
56
- class="size-12 text-muted-foreground mb-4"
57
- viewBox="0 0 24 24"
58
- fill="none"
59
- stroke="currentColor"
60
- stroke-width="2"
61
- stroke-linecap="round"
62
- stroke-linejoin="round"
63
- aria-hidden="true"
64
- >
65
- <path d="M12 17h.01" />
66
- <path d="M10.1 9a2.4 2.4 0 0 1 3.9 1.9c0 1.5-2 2-2 3" />
67
- <path d="M14.5 4.5 20 10l-2 2" />
68
- <path d="M4 4h9l7 7v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1Z" />
69
- </svg>
51
+ <app-icon name="notFound" size="3rem" class="text-muted-foreground mb-4" />
70
52
  <h2 class="text-lg font-semibold mb-1">Account not found</h2>
71
53
  <p class="text-sm text-muted-foreground mb-6">
72
54
  The account you're looking for doesn't exist or may have been deleted.
@@ -75,7 +57,6 @@
75
57
  </app-card-content>
76
58
  </app-card>
77
59
  } @else if (account()) {
78
- <!-- Content -->
79
60
  <h1 class="text-2xl font-bold mb-4">Account: {{ title() }}</h1>
80
61
 
81
62
  <app-card>
@@ -100,7 +81,6 @@
100
81
 
101
82
  <app-separator />
102
83
 
103
- <!-- Additional Information -->
104
84
  <app-collapsible title="Additional Information" [(open)]="additionalOpen">
105
85
  <div class="space-y-4">
106
86
  @for (row of additionalRows(); track $index) {
@@ -122,7 +102,6 @@
122
102
  <div class="space-y-4"></div>
123
103
  <app-separator />
124
104
 
125
- <!-- Address Information -->
126
105
  <app-collapsible title="Address Information" [(open)]="addressOpen">
127
106
  <div class="grid grid-cols-2 gap-x-8 gap-y-4">
128
107
  <div>
@@ -145,7 +124,6 @@
145
124
  </app-collapsible>
146
125
  <div class="space-y-4"></div>
147
126
  <app-separator />
148
- <!-- System Information -->
149
127
  <app-collapsible title="System Information" [(open)]="systemOpen">
150
128
  <div class="grid grid-cols-2 gap-x-8 gap-y-4">
151
129
  <div>