@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.
- package/dist/CHANGELOG.md +16 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/angular.json +2 -7
- package/dist/force-app/main/default/uiBundles/angularextapp/components.json +6 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/eslint.config.js +9 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/package.json +16 -11
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.config.ts +4 -6
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/app.routes.ts +2 -2
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.html +9 -13
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/alert/alert.ts +16 -28
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.html +19 -10
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.ts +34 -25
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.ts +40 -50
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.html +38 -10
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/collapsible/collapsible.ts +6 -11
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.html +17 -22
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.ts +29 -21
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.html +16 -30
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.ts +39 -36
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.html +13 -30
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dialog/dialog.ts +6 -21
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.html +5 -11
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field/field.ts +10 -18
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/field-appearance.ts +8 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/icon/icon.ts +62 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.html +32 -17
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.ts +57 -14
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.ts +8 -4
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.html +74 -10
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/paginator.ts +74 -18
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/paginator/types.ts +13 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.html +10 -38
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/popover/popover.ts +12 -15
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.html +34 -22
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.ts +25 -34
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.ts +11 -36
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.ts +5 -9
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/spinner/spinner.ts +14 -21
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/auth-form/auth-form.html +2 -3
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.html +31 -21
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/menu/auth-menu/auth-menu.ts +6 -18
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/session/session.html +2 -2
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.html +8 -4
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.ts +4 -16
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.html +4 -24
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/breadcrumb/breadcrumb.ts +3 -16
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-filter.ts +1 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.html +2 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/date-range-filter.ts +6 -15
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.html +2 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/filter-field-wrapper.ts +2 -17
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/multi-select-filter.html +2 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/numeric-range-filter.ts +3 -21
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.html +3 -3
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/search-filter.ts +9 -13
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.html +2 -5
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/select-filter.ts +1 -15
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.html +2 -5
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/filters/text-filter.ts +3 -17
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/pagination/pagination.ts +4 -20
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.html +10 -59
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/search-bar/search-bar.ts +13 -93
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.html +3 -29
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/object-search/sort-control/sort-control.ts +5 -12
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.html +1 -23
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.ts +3 -23
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.html +1 -19
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-search/account-search-page.ts +8 -36
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.html +15 -4
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.spec.ts +8 -6
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home.ts +56 -4
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/index.ts +16 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-action.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-description.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert-title.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/alert/src/lib/hlm-alert.ts +35 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/index.ts +6 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/lib/hlm-button.token.ts +22 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/button/src/lib/hlm-button.ts +72 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/index.ts +16 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar-multi.ts +195 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar-range.ts +194 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-calendar.ts +189 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/calendar/src/lib/hlm-month-year-calendar.ts +119 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/index.ts +28 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-action.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-avatar.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-content.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-description.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-footer.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-header.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card-title.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card.token.ts +19 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/card/src/lib/hlm-card.ts +22 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/index.ts +13 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-content.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible-trigger.ts +9 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/collapsible/src/lib/hlm-collapsible.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/index.ts +38 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-multi-input.ts +104 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-anchor.ts +23 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-input.ts +118 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.token.ts +109 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-multi.ts +220 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker-trigger.ts +104 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.token.ts +69 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-picker.ts +203 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-input.ts +120 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.token.ts +86 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-date-range-picker.ts +252 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-input.ts +105 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.token.ts +89 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/date-picker/src/lib/hlm-month-year-picker.ts +196 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/index.ts +35 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-close.ts +9 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-content.ts +74 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-description.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-footer.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-header.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-overlay.ts +27 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-portal.ts +8 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-title.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog-trigger.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog.service.ts +46 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dialog/src/lib/hlm-dialog.ts +24 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/index.ts +49 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-checkbox.ts +54 -0
- 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
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-group.ts +14 -0
- 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
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-item.ts +42 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-label.ts +20 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio-indicator.ts +21 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-radio.ts +49 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-separator.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-shortcut.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub-trigger.ts +52 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-sub.ts +53 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-token.ts +26 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu-trigger.ts +46 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/dropdown-menu/src/lib/hlm-dropdown-menu.ts +57 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/index.ts +34 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-content.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-description.ts +53 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-error.ts +100 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-group.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-label.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-legend.ts +19 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-separator.ts +24 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-set.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field-title.ts +15 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/field/src/lib/hlm-field.ts +47 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input/src/index.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input/src/lib/hlm-input.ts +21 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/index.ts +19 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-addon.ts +40 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-button.ts +47 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-input.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group-text.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/input-group/src/lib/hlm-input-group.ts +18 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/label.html +11 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/src/index.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/label/src/lib/hlm-label.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/index.ts +31 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination-query-params.ts +191 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-numbered-pagination.ts +290 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-content.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-ellipsis.ts +27 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-item.ts +7 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-link.ts +51 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-next.ts +65 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination-previous.ts +65 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/pagination/src/lib/hlm-pagination.ts +19 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/index.ts +25 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-content.ts +25 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-description.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-header.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-portal.ts +8 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-title.ts +12 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover-trigger.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/popover/src/lib/hlm-popover.ts +23 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/index.ts +52 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-content.ts +44 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-group.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-item.ts +36 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-label.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-multiple.ts +37 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-placeholder.ts +17 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-portal.ts +8 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-scroll-down.ts +22 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-scroll-up.ts +22 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-separator.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-trigger.ts +59 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-value-template.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-value.ts +18 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-values-content.ts +9 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select-values.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/select/src/lib/hlm-select.ts +37 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/separator/src/index.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/separator/src/lib/hlm-separator.ts +19 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/skeleton/src/index.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/skeleton/src/lib/hlm-skeleton.ts +14 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/spinner/src/index.ts +5 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/spinner/src/lib/hlm-spinner.ts +26 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/index.ts +2 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/lib/hlm.ts +313 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/shared/spartan/utils/src/lib/provide-spartan-hlm.ts +34 -0
- package/dist/force-app/main/default/uiBundles/angularextapp/src/index.html +0 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/{styles.scss → styles.css} +7 -38
- package/dist/force-app/main/default/uiBundles/angularextapp/tsconfig.json +4 -1
- package/dist/package-lock.json +2 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/_field-size.scss +0 -42
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/button/button.scss +0 -112
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/card/card.scss +0 -34
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-picker/date-picker.scss +0 -36
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/date-range-picker/date-range-picker.scss +0 -33
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/input/input.scss +0 -35
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/label/label.html +0 -3
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/select/select.scss +0 -35
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.html +0 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/separator/separator.scss +0 -23
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.html +0 -1
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/components/ui/skeleton/skeleton.scss +0 -28
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/features/authentication/submit-button/submit-button.scss +0 -17
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/account-detail/account-detail-page.scss +0 -7
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.html +0 -18
- package/dist/force-app/main/default/uiBundles/angularextapp/src/app/pages/home/home-page.ts +0 -47
- 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
|
-
|
|
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
|
|
28
|
-
*
|
|
29
|
-
*
|
|
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: [
|
|
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
|
|
30
|
-
* {@link FILTER_DEBOUNCE_MS}ms trailing debounce
|
|
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
|
|
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
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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
|
-
<
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* the
|
|
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: [
|
|
18
|
+
imports: [InputComponent],
|
|
19
|
+
host: { class: "flex-1 block" },
|
|
51
20
|
templateUrl: "./search-bar.html",
|
|
52
21
|
})
|
|
53
|
-
export class SearchBarComponent
|
|
54
|
-
|
|
55
|
-
readonly
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
[
|
|
14
|
+
[ariaLabel]="'Sort ' + (active.direction === 'ASC' ? 'descending' : 'ascending')"
|
|
15
15
|
(clicked)="toggleDirection()"
|
|
16
16
|
>
|
|
17
17
|
@if (active.direction === "ASC") {
|
|
18
|
-
<
|
|
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
|
-
<
|
|
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.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
-
<
|
|
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>
|