@agorapulse/ui-components 22.2.6 → 22.2.8-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agorapulse-ui-components-22.2.8-beta.1.tgz +0 -0
- package/fesm2022/agorapulse-ui-components-action-dropdown.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-action-dropdown.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-avatar-group.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-avatar-group.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-datepicker.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-datepicker.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-filter-chips-list.mjs +2 -2
- package/fesm2022/agorapulse-ui-components-filter-chips-list.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-filter-dropdown.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-filter-dropdown.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-labels.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-labels.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-nav-selector.mjs +4 -4
- package/fesm2022/agorapulse-ui-components-nav-selector.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-radio-button-card.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-radio-button-card.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-select.mjs +5 -5
- package/fesm2022/agorapulse-ui-components-select.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-selection-dropdown.mjs +1 -1
- package/fesm2022/agorapulse-ui-components-selection-dropdown.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-tooltip.mjs +181 -361
- package/fesm2022/agorapulse-ui-components-tooltip.mjs.map +1 -1
- package/package.json +1 -1
- package/types/agorapulse-ui-components-tooltip.d.ts +65 -33
- package/agorapulse-ui-components-22.2.6.tgz +0 -0
|
@@ -517,7 +517,7 @@ class SelectionDropdownComponent {
|
|
|
517
517
|
this.filteredItems.set(filtered);
|
|
518
518
|
}
|
|
519
519
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SelectionDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
520
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SelectionDropdownComponent, isStandalone: true, selector: "ap-selection-dropdown", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, selectedSectionText: { classPropertyName: "selectedSectionText", publicName: "selectedSectionText", isSignal: true, isRequired: false, transformFunction: null }, optionsSectionText: { classPropertyName: "optionsSectionText", publicName: "optionsSectionText", isSignal: true, isRequired: false, transformFunction: null }, headerButtonId: { classPropertyName: "headerButtonId", publicName: "headerButtonId", isSignal: true, isRequired: false, transformFunction: null }, footerButtonId: { classPropertyName: "footerButtonId", publicName: "footerButtonId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, searchEnabled: { classPropertyName: "searchEnabled", publicName: "searchEnabled", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, footerButtonText: { classPropertyName: "footerButtonText", publicName: "footerButtonText", isSignal: true, isRequired: false, transformFunction: null }, footerButtonSymbolId: { classPropertyName: "footerButtonSymbolId", publicName: "footerButtonSymbolId", isSignal: true, isRequired: false, transformFunction: null }, headerButtonText: { classPropertyName: "headerButtonText", publicName: "headerButtonText", isSignal: true, isRequired: false, transformFunction: null }, headerButtonSymbolId: { classPropertyName: "headerButtonSymbolId", publicName: "headerButtonSymbolId", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholderText: { classPropertyName: "searchPlaceholderText", publicName: "searchPlaceholderText", isSignal: true, isRequired: false, transformFunction: null }, noSearchResultsText: { classPropertyName: "noSearchResultsText", publicName: "noSearchResultsText", isSignal: true, isRequired: false, transformFunction: null }, searchResultsText: { classPropertyName: "searchResultsText", publicName: "searchResultsText", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, searchTerm: { classPropertyName: "searchTerm", publicName: "searchTerm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", selectionChange: "selectionChange", footerButtonClick: "footerButtonClick", headerButtonClick: "headerButtonClick", searchInputChange: "searchInputChange", searchTerm: "searchTermChange" }, queries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "panel", first: true, predicate: DropdownPanelComponent, descendants: true, isSignal: true }, { propertyName: "options", predicate: DropdownOptionDirective, descendants: true, isSignal: true }, { propertyName: "inputSearchComponent", first: true, predicate: ["inputSearchElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<ap-dropdown-panel\n [placement]=\"placement()\"\n [showBackdrop]=\"showBackdrop()\"\n (closed)=\"onPanelClosed()\">\n <!-- `dialog`, not a combobox: a combobox must close when focus leaves it, and this panel holds a\n search field, a header, a footer and group checkboxes beside its lists \u2014 closing on Tab left\n every one of them unreachable. -->\n <div\n *apDropdownContent\n class=\"ap-selection-dropdown__content\"\n role=\"dialog\"\n tabindex=\"-1\"\n [attr.aria-label]=\"panelLabel()\"\n (keydown)=\"onOptionsKeyDown($event)\"\n [class.ap-selection-dropdown__content--single]=\"isSingleSelect()\">\n <!-- Header -->\n @if (headerVisible()) {\n <div class=\"ap-selection-dropdown__header\">\n @if (headerTopVisible()) {\n <div class=\"ap-selection-dropdown__header-top\">\n @if (title()) {\n <h3 class=\"ap-selection-dropdown__title\">\n {{ title() }}\n </h3>\n }\n @if (headerButtonText()) {\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"headerButtonId()\"\n (click)=\"onHeaderButtonClick()\">\n <ap-symbol [symbolId]=\"headerButtonSymbolId()\" />\n {{ headerButtonText() }}\n </button>\n }\n </div>\n }\n @if (searchVisible()) {\n <ap-input-search\n #inputSearchElement\n [placeholder]=\"searchPlaceholderText()\"\n [clearable]=\"true\"\n [ariaControls]=\"listboxId\"\n [ariaActiveDescendant]=\"activeDescendantId()\"\n [ngModel]=\"searchTerm()\"\n (blur)=\"onSearchBlur()\"\n (ngModelChange)=\"onSearchTermChange($event)\" />\n }\n </div>\n }\n\n <!-- Selection dropdown items -->\n <div\n class=\"ap-selection-dropdown__items\"\n [id]=\"listboxId\"\n [attr.role]=\"isSingleSelect() ? 'listbox' : null\"\n [attr.aria-label]=\"isSingleSelect() ? (title() ?? null) : null\">\n @if (filteredItems().length === 0 && searchTerm()) {\n <div class=\"ap-selection-dropdown__no-results\">\n {{ noSearchResultsText() }}\n </div>\n } @else if (isSingleSelect()) {\n @for (item of filteredItems(); track item.htmlId) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__option\"\n [id]=\"optionId(item)\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [tabindex]=\"optionTabIndex(activeIndex() === $index)\"\n [attr.aria-selected]=\"item.selected\"\n [attr.aria-disabled]=\"item.disabled || item.isFeatureLocked\"\n [attr.data-track]=\"item.dataTrack\"\n [apTooltip]=\"item.disabled ? (item.disabledTooltip ?? null) : null\"\n apTooltipPosition=\"right\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-single-one-line\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [standaloneModeEnabled]=\"true\" />\n </button>\n }\n } @else {\n <!-- A listbox owns only options, so each section is its own, and a group's checkbox sits beside it. -->\n @if (selectedItems().length > 0) {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n class=\"ap-selection-dropdown__selected-section\"\n [attr.aria-label]=\"selectedSectionText()\">\n @for (item of selectedItems(); track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n }\n\n <!-- Unselected zone: items & groups in first-encounter order -->\n @for (run of displayRuns(); track runKey(run)) {\n @if (run.kind === 'items') {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"title() ?? optionsSectionText()\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n } @else {\n <div class=\"ap-selection-dropdown__group\">\n <!-- Group header with checkbox -->\n <div class=\"ap-selection-dropdown__group-header\">\n <div class=\"ap-selection-dropdown__group-label\">\n <ap-checkbox\n class=\"centered\"\n [name]=\"run.label\"\n [checked]=\"groupSelectionStates()[run.label] === 'selected'\"\n [indeterminate]=\"groupSelectionStates()[run.label] === 'partial'\"\n (change)=\"onGroupToggle(run.label, $event)\">\n {{ run.label }}\n </ap-checkbox>\n </div>\n </div>\n\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"run.label\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = true;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n </div>\n }\n }\n }\n </div>\n\n <div\n class=\"ap-selection-dropdown__status\"\n role=\"status\"\n aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n\n <!-- Footer -->\n @if (footerButtonText()) {\n <div class=\"ap-selection-dropdown__footer\">\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"footerButtonId()\"\n (click)=\"onFooterButtonClick()\">\n <ap-symbol [symbolId]=\"footerButtonSymbolId()\" />\n {{ footerButtonText() }}\n </button>\n </div>\n }\n </div>\n</ap-dropdown-panel>\n", styles: [":host{display:none}.ap-selection-dropdown__content{border-radius:inherit;overflow:hidden;z-index:1000;width:370px;display:flex;flex-direction:column;max-height:min(400px,var(--ap-floating-available-height, 100vh))}.ap-selection-dropdown__content--single{width:auto;min-width:160px}.ap-selection-dropdown__option{display:block;width:100%;padding:0;border:none;background:none;font:inherit;text-align:inherit}.ap-selection-dropdown__item-button{display:block;width:100%;padding:0;margin:0;border:none;background:transparent;text-align:left;cursor:pointer;outline:none}.ap-selection-dropdown__item-button:hover,.ap-selection-dropdown__item-button.ap-dropdown-option--active{background-color:var(--ref-color-electric-blue-10)}.ap-selection-dropdown__item-button:active{background-color:var(--ref-color-electric-blue-20)}.ap-selection-dropdown__item-button:focus{outline:none}.ap-selection-dropdown__item-button:focus-visible{outline:none}.ap-selection-dropdown__item-button.ap-selection-dropdown__item-button--disabled{pointer-events:none}.ap-selection-dropdown__item{display:flex;align-items:center;width:100%;min-height:40px;padding:var(--ref-spacing-xxs) var(--ref-spacing-sm);background:transparent;cursor:pointer;font-family:Averta}.ap-selection-dropdown__group-header{display:flex;align-items:center;padding:var(--ref-spacing-xxs) var(--ref-spacing-sm);border-top:1px solid var(--ref-color-grey-10);background:var(--ref-color-grey-bg)}.ap-selection-dropdown__group-label{display:flex;align-items:center;flex:1;font-weight:700;color:var(--ref-color-grey-100)}.ap-selection-dropdown__group-label ap-checkbox{--comp-forms-label-font-weight: 700}.ap-selection-dropdown__header{border-bottom:1px solid var(--ref-color-grey-10);flex-shrink:0;display:flex;flex-direction:column}.ap-selection-dropdown__header .ap-selection-dropdown__header-top{display:flex;align-items:center;justify-content:space-between;padding:var(--ref-spacing-xs) var(--ref-spacing-sm)}.ap-selection-dropdown__header .ap-selection-dropdown__title{margin:0;font-size:var(--ref-font-size-md);font-weight:var(--ref-font-weight-bold);color:var(--ref-color-grey-100);flex:1}.ap-selection-dropdown__header ap-input-search{width:100%;padding:0 var(--ref-spacing-xxs) var(--ref-spacing-xxs)}.ap-selection-dropdown__items{padding:var(--ref-spacing-xxs) 0;flex:1;overflow-y:auto;min-height:0}.ap-selection-dropdown__no-results{padding:var(--ref-spacing-xxs) var(--ref-spacing-sm);color:var(--ref-color-grey-80);font-size:var(--ref-font-size-sm);font-style:italic}.ap-selection-dropdown__footer{height:40px;padding:var(--ref-spacing-xs) var(--ref-spacing-sm);border-top:1px solid var(--ref-color-grey-10);flex-shrink:0;display:flex;align-items:center;justify-content:flex-start}.ap-selection-dropdown__selected-section{margin-bottom:var(--ref-spacing-xxs);border-bottom:1px solid var(--ref-color-grey-10);padding-bottom:var(--ref-spacing-xxs)}.ap-selection-dropdown__selected-section ::ng-deep ap-checkbox{--comp-forms-label-font-weight: 700}.ap-selection-dropdown__status{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}\n"], dependencies: [{ kind: "component", type: CheckboxComponent, selector: "ap-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "disabled", "indeterminate", "checked", "fullyControlled", "presentational", "required", "name"], outputs: ["change"] }, { kind: "directive", type: DropdownContentDirective, selector: "ng-template[apDropdownContent]" }, { kind: "directive", type: DropdownOptionDirective, selector: "[apDropdownOption]", inputs: ["apDropdownOption", "apDropdownOptionDisabled"] }, { kind: "component", type: DropdownItemMultipleOneLineComponent, selector: "ap-dropdown-item-multiple-one-line", inputs: ["text", "selected", "indeterminate", "htmlId", "disabled", "avatarUrl", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "presentational", "onlyEnabled", "onlyText", "isFeatureLocked", "roundedAvatar", "network", "symbolColor", "symbolTooltipText"], outputs: ["selectOnly", "lockedFeatureClicked"] }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked", "standaloneModeEnabled"], outputs: ["lockedFeatureClicked"] }, { kind: "component", type: DropdownPanelComponent, selector: "ap-dropdown-panel", inputs: ["placement", "showBackdrop", "panelClass", "canDismiss"], outputs: ["opened", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputSearchComponent, selector: "ap-input-search", inputs: ["id", "placeholder", "clearable", "ariaControls", "ariaActiveDescendant"], outputs: ["focus", "blur", "keyup"] }, { kind: "component", type: SymbolComponent, selector: "ap-symbol", inputs: ["symbolId", "color", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: TooltipDirective, selector: "[apTooltip]", inputs: ["apTooltip", "apTooltipPosition", "apTooltipShowDelay", "apTooltipHideDelay", "apTooltipDuration", "apTooltipDisabled", "apTooltipTruncatedTextOnly", "apTooltipTemplateContext", "apTooltipVirtualScrollElement", "apTooltipTrigger", "apTooltipType", "apTooltipPresentationContext", "apTooltipListItems", "apTooltipShowAvatarCaption"], exportAs: ["apTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
520
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SelectionDropdownComponent, isStandalone: true, selector: "ap-selection-dropdown", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, selectedSectionText: { classPropertyName: "selectedSectionText", publicName: "selectedSectionText", isSignal: true, isRequired: false, transformFunction: null }, optionsSectionText: { classPropertyName: "optionsSectionText", publicName: "optionsSectionText", isSignal: true, isRequired: false, transformFunction: null }, headerButtonId: { classPropertyName: "headerButtonId", publicName: "headerButtonId", isSignal: true, isRequired: false, transformFunction: null }, footerButtonId: { classPropertyName: "footerButtonId", publicName: "footerButtonId", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, searchEnabled: { classPropertyName: "searchEnabled", publicName: "searchEnabled", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, footerButtonText: { classPropertyName: "footerButtonText", publicName: "footerButtonText", isSignal: true, isRequired: false, transformFunction: null }, footerButtonSymbolId: { classPropertyName: "footerButtonSymbolId", publicName: "footerButtonSymbolId", isSignal: true, isRequired: false, transformFunction: null }, headerButtonText: { classPropertyName: "headerButtonText", publicName: "headerButtonText", isSignal: true, isRequired: false, transformFunction: null }, headerButtonSymbolId: { classPropertyName: "headerButtonSymbolId", publicName: "headerButtonSymbolId", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholderText: { classPropertyName: "searchPlaceholderText", publicName: "searchPlaceholderText", isSignal: true, isRequired: false, transformFunction: null }, noSearchResultsText: { classPropertyName: "noSearchResultsText", publicName: "noSearchResultsText", isSignal: true, isRequired: false, transformFunction: null }, searchResultsText: { classPropertyName: "searchResultsText", publicName: "searchResultsText", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, searchTerm: { classPropertyName: "searchTerm", publicName: "searchTerm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", selectionChange: "selectionChange", footerButtonClick: "footerButtonClick", headerButtonClick: "headerButtonClick", searchInputChange: "searchInputChange", searchTerm: "searchTermChange" }, queries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "panel", first: true, predicate: DropdownPanelComponent, descendants: true, isSignal: true }, { propertyName: "options", predicate: DropdownOptionDirective, descendants: true, isSignal: true }, { propertyName: "inputSearchComponent", first: true, predicate: ["inputSearchElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<ap-dropdown-panel\n [placement]=\"placement()\"\n [showBackdrop]=\"showBackdrop()\"\n (closed)=\"onPanelClosed()\">\n <!-- `dialog`, not a combobox: a combobox must close when focus leaves it, and this panel holds a\n search field, a header, a footer and group checkboxes beside its lists \u2014 closing on Tab left\n every one of them unreachable. -->\n <div\n *apDropdownContent\n class=\"ap-selection-dropdown__content\"\n role=\"dialog\"\n tabindex=\"-1\"\n [attr.aria-label]=\"panelLabel()\"\n (keydown)=\"onOptionsKeyDown($event)\"\n [class.ap-selection-dropdown__content--single]=\"isSingleSelect()\">\n <!-- Header -->\n @if (headerVisible()) {\n <div class=\"ap-selection-dropdown__header\">\n @if (headerTopVisible()) {\n <div class=\"ap-selection-dropdown__header-top\">\n @if (title()) {\n <h3 class=\"ap-selection-dropdown__title\">\n {{ title() }}\n </h3>\n }\n @if (headerButtonText()) {\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"headerButtonId()\"\n (click)=\"onHeaderButtonClick()\">\n <ap-symbol [symbolId]=\"headerButtonSymbolId()\" />\n {{ headerButtonText() }}\n </button>\n }\n </div>\n }\n @if (searchVisible()) {\n <ap-input-search\n #inputSearchElement\n [placeholder]=\"searchPlaceholderText()\"\n [clearable]=\"true\"\n [ariaControls]=\"listboxId\"\n [ariaActiveDescendant]=\"activeDescendantId()\"\n [ngModel]=\"searchTerm()\"\n (blur)=\"onSearchBlur()\"\n (ngModelChange)=\"onSearchTermChange($event)\" />\n }\n </div>\n }\n\n <!-- Selection dropdown items -->\n <div\n class=\"ap-selection-dropdown__items\"\n [id]=\"listboxId\"\n [attr.role]=\"isSingleSelect() ? 'listbox' : null\"\n [attr.aria-label]=\"isSingleSelect() ? (title() ?? null) : null\">\n @if (filteredItems().length === 0 && searchTerm()) {\n <div class=\"ap-selection-dropdown__no-results\">\n {{ noSearchResultsText() }}\n </div>\n } @else if (isSingleSelect()) {\n @for (item of filteredItems(); track item.htmlId) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__option\"\n [id]=\"optionId(item)\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [tabindex]=\"optionTabIndex(activeIndex() === $index)\"\n [attr.aria-selected]=\"item.selected\"\n [attr.aria-disabled]=\"item.disabled || item.isFeatureLocked\"\n [attr.data-track]=\"item.dataTrack\"\n [apTooltip]=\"item.disabled ? (item.disabledTooltip ?? null) : null\"\n apTooltipPosition=\"right\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-single-one-line\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [standaloneModeEnabled]=\"true\" />\n </button>\n }\n } @else {\n <!-- A listbox owns only options, so each section is its own, and a group's checkbox sits beside it. -->\n @if (selectedItems().length > 0) {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n class=\"ap-selection-dropdown__selected-section\"\n [attr.aria-label]=\"selectedSectionText()\">\n @for (item of selectedItems(); track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n }\n\n <!-- Unselected zone: items & groups in first-encounter order -->\n @for (run of displayRuns(); track runKey(run)) {\n @if (run.kind === 'items') {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"title() ?? optionsSectionText()\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n } @else {\n <div class=\"ap-selection-dropdown__group\">\n <!-- Group header with checkbox -->\n <div class=\"ap-selection-dropdown__group-header\">\n <div class=\"ap-selection-dropdown__group-label\">\n <ap-checkbox\n class=\"centered\"\n [name]=\"run.label\"\n [checked]=\"groupSelectionStates()[run.label] === 'selected'\"\n [indeterminate]=\"groupSelectionStates()[run.label] === 'partial'\"\n (change)=\"onGroupToggle(run.label, $event)\">\n {{ run.label }}\n </ap-checkbox>\n </div>\n </div>\n\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"run.label\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = true;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n </div>\n }\n }\n }\n </div>\n\n <div\n class=\"ap-selection-dropdown__status\"\n role=\"status\"\n aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n\n <!-- Footer -->\n @if (footerButtonText()) {\n <div class=\"ap-selection-dropdown__footer\">\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"footerButtonId()\"\n (click)=\"onFooterButtonClick()\">\n <ap-symbol [symbolId]=\"footerButtonSymbolId()\" />\n {{ footerButtonText() }}\n </button>\n </div>\n }\n </div>\n</ap-dropdown-panel>\n", styles: [":host{display:none}.ap-selection-dropdown__content{border-radius:inherit;overflow:hidden;z-index:1000;width:370px;display:flex;flex-direction:column;max-height:min(400px,var(--ap-floating-available-height, 100vh))}.ap-selection-dropdown__content--single{width:auto;min-width:160px}.ap-selection-dropdown__option{display:block;width:100%;padding:0;border:none;background:none;font:inherit;text-align:inherit}.ap-selection-dropdown__item-button{display:block;width:100%;padding:0;margin:0;border:none;background:transparent;text-align:left;cursor:pointer;outline:none}.ap-selection-dropdown__item-button:hover,.ap-selection-dropdown__item-button.ap-dropdown-option--active{background-color:var(--ref-color-electric-blue-10)}.ap-selection-dropdown__item-button:active{background-color:var(--ref-color-electric-blue-20)}.ap-selection-dropdown__item-button:focus{outline:none}.ap-selection-dropdown__item-button:focus-visible{outline:none}.ap-selection-dropdown__item-button.ap-selection-dropdown__item-button--disabled{pointer-events:none}.ap-selection-dropdown__item{display:flex;align-items:center;width:100%;min-height:40px;padding:var(--ref-spacing-xxs) var(--ref-spacing-sm);background:transparent;cursor:pointer;font-family:Averta}.ap-selection-dropdown__group-header{display:flex;align-items:center;padding:var(--ref-spacing-xxs) var(--ref-spacing-sm);border-top:1px solid var(--ref-color-grey-10);background:var(--ref-color-grey-bg)}.ap-selection-dropdown__group-label{display:flex;align-items:center;flex:1;font-weight:700;color:var(--ref-color-grey-100)}.ap-selection-dropdown__group-label ap-checkbox{--comp-forms-label-font-weight: 700}.ap-selection-dropdown__header{border-bottom:1px solid var(--ref-color-grey-10);flex-shrink:0;display:flex;flex-direction:column}.ap-selection-dropdown__header .ap-selection-dropdown__header-top{display:flex;align-items:center;justify-content:space-between;padding:var(--ref-spacing-xs) var(--ref-spacing-sm)}.ap-selection-dropdown__header .ap-selection-dropdown__title{margin:0;font-size:var(--ref-font-size-md);font-weight:var(--ref-font-weight-bold);color:var(--ref-color-grey-100);flex:1}.ap-selection-dropdown__header ap-input-search{width:100%;padding:0 var(--ref-spacing-xxs) var(--ref-spacing-xxs)}.ap-selection-dropdown__items{padding:var(--ref-spacing-xxs) 0;flex:1;overflow-y:auto;min-height:0}.ap-selection-dropdown__no-results{padding:var(--ref-spacing-xxs) var(--ref-spacing-sm);color:var(--ref-color-grey-80);font-size:var(--ref-font-size-sm);font-style:italic}.ap-selection-dropdown__footer{height:40px;padding:var(--ref-spacing-xs) var(--ref-spacing-sm);border-top:1px solid var(--ref-color-grey-10);flex-shrink:0;display:flex;align-items:center;justify-content:flex-start}.ap-selection-dropdown__selected-section{margin-bottom:var(--ref-spacing-xxs);border-bottom:1px solid var(--ref-color-grey-10);padding-bottom:var(--ref-spacing-xxs)}.ap-selection-dropdown__selected-section ::ng-deep ap-checkbox{--comp-forms-label-font-weight: 700}.ap-selection-dropdown__status{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}\n"], dependencies: [{ kind: "component", type: CheckboxComponent, selector: "ap-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "disabled", "indeterminate", "checked", "fullyControlled", "presentational", "required", "name"], outputs: ["change"] }, { kind: "directive", type: DropdownContentDirective, selector: "ng-template[apDropdownContent]" }, { kind: "directive", type: DropdownOptionDirective, selector: "[apDropdownOption]", inputs: ["apDropdownOption", "apDropdownOptionDisabled"] }, { kind: "component", type: DropdownItemMultipleOneLineComponent, selector: "ap-dropdown-item-multiple-one-line", inputs: ["text", "selected", "indeterminate", "htmlId", "disabled", "avatarUrl", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "presentational", "onlyEnabled", "onlyText", "isFeatureLocked", "roundedAvatar", "network", "symbolColor", "symbolTooltipText"], outputs: ["selectOnly", "lockedFeatureClicked"] }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked", "standaloneModeEnabled"], outputs: ["lockedFeatureClicked"] }, { kind: "component", type: DropdownPanelComponent, selector: "ap-dropdown-panel", inputs: ["placement", "showBackdrop", "panelClass", "canDismiss"], outputs: ["opened", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputSearchComponent, selector: "ap-input-search", inputs: ["id", "placeholder", "clearable", "ariaControls", "ariaActiveDescendant"], outputs: ["focus", "blur", "keyup"] }, { kind: "component", type: SymbolComponent, selector: "ap-symbol", inputs: ["symbolId", "color", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: TooltipDirective, selector: "[apTooltip]", inputs: ["apTooltip", "apTooltipPosition", "apTooltipShowDelay", "apTooltipHideDelay", "apTooltipDuration", "apTooltipDisabled", "apTooltipTruncatedTextOnly", "apTooltipTemplateContext", "apTooltipVirtualScrollElement", "apTooltipTrigger", "apTooltipArrow", "apTooltipType", "apTooltipPresentationContext", "apTooltipListItems", "apTooltipShowAvatarCaption"], exportAs: ["apTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
521
521
|
}
|
|
522
522
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SelectionDropdownComponent, decorators: [{
|
|
523
523
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agorapulse-ui-components-selection-dropdown.mjs","sources":["../../../libs/ui-components/selection-dropdown/src/selection-dropdown-trigger.directive.ts","../../../libs/ui-components/selection-dropdown/src/selection-dropdown.component.ts","../../../libs/ui-components/selection-dropdown/src/selection-dropdown.component.html","../../../libs/ui-components/selection-dropdown/src/agorapulse-ui-components-selection-dropdown.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, inject, input } from '@angular/core';\nimport { SelectionDropdownComponent } from './selection-dropdown.component';\n\n/**\n * Directive that turns any element into a trigger for a SelectionDropdown component.\n * Handles click and keyboard interactions to open/close the dropdown.\n */\n@Directive({\n selector: '[apSelectionDropdownTrigger]',\n})\nexport class SelectionDropdownTriggerDirective {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** Reference to the SelectionDropdown component that this trigger controls */\n apSelectionDropdownTrigger = input.required<SelectionDropdownComponent>();\n\n /** Prevents the trigger from opening/toggling the dropdown when true */\n apSelectionDropdownTriggerDisable = input(false);\n\n /** Handles click events to toggle the dropdown */\n @HostListener('click', ['$event'])\n onClick(event: MouseEvent): void {\n if (this.apSelectionDropdownTriggerDisable()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n this.apSelectionDropdownTrigger().toggle(this.elementRef.nativeElement);\n }\n\n /** Handles keyboard events for accessibility (Enter, Space, Arrow Down, Escape) */\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const dropdown = this.apSelectionDropdownTrigger();\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n if (this.apSelectionDropdownTriggerDisable()) return;\n event.preventDefault();\n dropdown.open(this.elementRef.nativeElement);\n break;\n\n case 'Escape':\n event.preventDefault();\n dropdown.close();\n break;\n }\n }\n}\n","import { CheckboxComponent } from '@agorapulse/ui-components/checkbox';\nimport { ActiveDescendantKeyManager, FocusKeyManager, ListKeyManager } from '@angular/cdk/a11y';\nimport { DropdownOptionDirective, DropdownOverlay } from '@agorapulse/ui-components/dropdown-base';\nimport { DropdownContentDirective, DropdownPanelComponent } from '@agorapulse/ui-components/dropdown-panel';\nimport { FloatingPlacement } from '@agorapulse/ui-components/floating';\nimport { InputSearchComponent } from '@agorapulse/ui-components/input-search';\nimport { UI_COMPONENTS_SYMBOLS } from '@agorapulse/ui-components/providers';\nimport { DropdownItemMultipleOneLineComponent, DropdownItemSingleOneLineComponent } from '@agorapulse/ui-components/select';\nimport { TooltipDirective } from '@agorapulse/ui-components/tooltip';\nimport { apCheck, SymbolComponent, SymbolRegistry } from '@agorapulse/ui-symbol';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n OnDestroy,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs';\n\n/** The only keys a search field hands to the list: Home and End belong to the caret, not the options. */\nconst NAVIGATION_FROM_SEARCH = new Set(['ArrowUp', 'ArrowDown']);\n\nexport interface SelectionDropdownItem {\n /** Unique HTML ID for the item */\n htmlId: string;\n /** Display text for the item */\n text: string;\n /** Whether the item is selected */\n selected: boolean;\n /** Whether the item is displayed in a mixed/indeterminate state. Takes visual precedence over `selected`. */\n indeterminate?: boolean;\n /** Whether the item is disabled and non-interactive */\n disabled?: boolean;\n /** Avatar URL to display */\n avatarUrl?: string;\n /** Symbol ID to display */\n symbolId?: string;\n /** Tooltip text displayed when item is disabled */\n disabledTooltip?: string;\n /** Text displayed in a badge next to the item */\n badgeText?: string;\n /** Whether the feature is locked */\n isFeatureLocked?: boolean;\n /** Whether avatar should be rounded */\n roundedAvatar?: boolean;\n /** Avatar network type */\n network?: any;\n /** Symbol color */\n symbolColor?: string;\n /** Symbol tooltip text */\n symbolTooltipText?: string;\n /** Group label - items with the same groupLabel will be grouped together */\n groupLabel?: string;\n dataTrack?: string;\n}\n\n/**\n * One rendered row in the unselected zone: either a standalone item or a group\n * holding the items that belong to it (in first-encounter order).\n */\ntype RenderEntry = { kind: 'item'; item: SelectionDropdownItem } | { kind: 'group'; label: string; items: SelectionDropdownItem[] };\n\n/** A run of consecutive ungrouped items, or a group. Each becomes one listbox of its own. */\ntype RenderRun = { kind: 'items'; items: SelectionDropdownItem[] } | Extract<RenderEntry, { kind: 'group' }>;\n\nexport type SelectionDropdownMode = 'multiple' | 'single';\n\n/** A dropdown of options on any trigger. `multiple` = checkbox rows with search; `single` = rows, closes on pick. */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'ap-selection-dropdown',\n templateUrl: './selection-dropdown.component.html',\n styleUrls: ['./selection-dropdown.component.scss'],\n imports: [\n CheckboxComponent,\n DropdownContentDirective,\n DropdownOptionDirective,\n DropdownItemMultipleOneLineComponent,\n DropdownItemSingleOneLineComponent,\n DropdownPanelComponent,\n FormsModule,\n InputSearchComponent,\n SymbolComponent,\n TooltipDirective,\n ],\n})\nexport class SelectionDropdownComponent implements DropdownOverlay, OnDestroy {\n private static nextId = 0;\n\n private readonly symbolRegistry = inject(SymbolRegistry);\n private readonly panel = viewChild(DropdownPanelComponent);\n private readonly options = viewChildren(DropdownOptionDirective);\n\n /** Mirrors the key manager's active index, so the roving tabindex can be bound. */\n protected readonly activeIndex = signal(-1);\n\n private readonly injector = inject(Injector);\n\n /** Names the dialog. Falls back to the visible title, then to a generic label rather than none. */\n readonly ariaLabel = input<string>();\n\n /** Names the listbox holding what is already selected. */\n readonly selectedSectionText = input('Selected');\n\n /** Names a listbox of ungrouped options when the dropdown has no title. */\n readonly optionsSectionText = input('Options');\n\n protected readonly panelLabel = computed(() => this.ariaLabel() ?? this.title() ?? 'Selection');\n\n protected readonly listboxId = `ap-selection-dropdown-list-${SelectionDropdownComponent.nextId++}`;\n\n private keyManager: ListKeyManager<DropdownOptionDirective> | null = null;\n private primed = false;\n\n trigger = contentChild<TemplateRef<unknown>>('trigger');\n\n /** ID for the header button */\n headerButtonId = input<string>();\n /** ID for the footer button */\n footerButtonId = input<string>();\n /** Array of items to display in the dropdown menu */\n items = input<SelectionDropdownItem[]>([]);\n /** Whether several options can be active at once, or exactly one. */\n selectionMode = input<SelectionDropdownMode>('multiple');\n /** Shows the search field. Ignored in `multiple` mode, which always searches. */\n searchEnabled = input(false);\n /** Title to display in the header */\n title = input<string>();\n /** Text for the footer button */\n footerButtonText = input<string>();\n /** Symbol ID for the footer button */\n footerButtonSymbolId = input<string>();\n /** Text for the header button */\n headerButtonText = input<string>();\n /** Symbol ID for the header button */\n headerButtonSymbolId = input<string>();\n /** Placeholder text for the search input */\n searchPlaceholderText = input('Search');\n /** Text to display when no search results are found */\n noSearchResultsText = input('No results found');\n\n /** Announced once a search settles. `{count}` is replaced by how many options matched. */\n searchResultsText = input('{count} results');\n\n /** Whether to show a backdrop that closes the dropdown when clicked */\n showBackdrop = input(true);\n /** Whether the dropdown is disabled and cannot be opened */\n disabled = input(false);\n /** Default position for the dropdown relative to the trigger element */\n /** Panel placement. Unset means derived from the anchor mode, i.e. `bottom-start`. */\n readonly placement = input<FloatingPlacement>();\n\n /** Emits when the dropdown menu is opened */\n opened = output<void>();\n /** Emits when the dropdown menu is closed */\n closed = output<void>();\n /** Emits when a dropdown item selection changes */\n selectionChange = output<SelectionDropdownItem[]>();\n /** Emits when the footer button is clicked */\n footerButtonClick = output<void>();\n /** Emits when the header button is clicked */\n headerButtonClick = output<void>();\n /** Emits when the search input is changed */\n searchInputChange = output<string>();\n\n /**\n * Two-way bindable, clearable search term. Consumers can read it and reset it (set to '')\n * to clear the search and restore the full item list — letting them drive the search\n * declaratively instead of reaching into the rendered `ap-input-search`.\n */\n readonly searchTerm = model<string>('');\n\n private readonly destroy$ = new Subject<void>();\n private readonly searchTermSubject = new Subject<string>();\n\n protected readonly inputSearchComponent = viewChild<InputSearchComponent>('inputSearchElement');\n\n readonly isOpen = computed(() => this.panel()?.isOpen() ?? false);\n\n focusInput = effect(() => {\n const inputSearch = this.inputSearchComponent();\n untracked(() => {\n if (this.isOpen() && inputSearch) {\n inputSearch.focusInput();\n }\n });\n });\n\n /** Single-select opens on its first option; multi does not, since marking one the user never chose announces a selection. */\n primeOptions = effect(() => {\n const open = this.isOpen();\n const options = this.options();\n untracked(() => {\n if (open && options.length > 0 && !this.primed && this.isSingleSelect()) {\n this.primed = true;\n this.activeManager().setFirstItemActive();\n }\n });\n });\n\n protected readonly isSingleSelect = computed(() => this.selectionMode() === 'single');\n\n /** Always true in `multiple` mode, leaving that layout untouched; only `single` collapses the header. */\n protected readonly searchVisible = computed(() => !this.isSingleSelect() || this.searchEnabled());\n protected readonly headerTopVisible = computed(() => !this.isSingleSelect() || !!this.title() || !!this.headerButtonText());\n protected readonly headerVisible = computed(() => this.headerTopVisible() || this.searchVisible());\n\n private readonly internalItems = linkedSignal(() => this.items());\n\n protected readonly filteredItems = signal<SelectionDropdownItem[]>([]);\n\n /** What the live region holds. Empty outside a search: the list is on screen, unchanged. */\n protected readonly resultsAnnouncement = signal('');\n protected readonly initiallySelectedItems = signal<SelectionDropdownItem[]>([]);\n\n // Computed properties for template usage\n protected readonly selectedItems = computed(() => {\n const initiallySelectedIds = this.initiallySelectedItems().map(item => item.htmlId);\n return this.filteredItems().filter(item => initiallySelectedIds.includes(item.htmlId));\n });\n\n protected readonly unselectedItems = computed(() => {\n const initiallySelectedIds = this.initiallySelectedItems().map(item => item.htmlId);\n return this.filteredItems().filter(item => !initiallySelectedIds.includes(item.htmlId));\n });\n\n /**\n * Unselected items rebuilt into a single ordered list: standalone items and\n * groups appear in the order their first item is encountered; later items of\n * an already-seen group join that existing group entry.\n */\n protected readonly displayEntries = computed<RenderEntry[]>(() => {\n const entries: RenderEntry[] = [];\n const groupsByLabel = new Map<string, Extract<RenderEntry, { kind: 'group' }>>();\n\n for (const item of this.unselectedItems()) {\n const label = item.groupLabel;\n if (!label) {\n entries.push({ kind: 'item', item });\n continue;\n }\n\n const existing = groupsByLabel.get(label);\n if (existing) {\n // `existing` is the same object reference already pushed into `entries`,\n // so mutating its items array updates the rendered group in place.\n existing.items.push(item);\n } else {\n const group: Extract<RenderEntry, { kind: 'group' }> = { kind: 'group', label, items: [item] };\n groupsByLabel.set(label, group);\n entries.push(group);\n }\n }\n\n return entries;\n });\n\n /**\n * A listbox owns only options, so a group's checkbox cannot sit inside one: each group gets its own\n * listbox, and the ungrouped items between two groups are collected into one rather than one each.\n */\n protected readonly displayRuns = computed<RenderRun[]>(() => {\n const runs: RenderRun[] = [];\n\n for (const entry of this.displayEntries()) {\n if (entry.kind === 'group') {\n runs.push(entry);\n continue;\n }\n\n const last = runs[runs.length - 1];\n if (last?.kind === 'items') {\n last.items.push(entry.item);\n } else {\n runs.push({ kind: 'items', items: [entry.item] });\n }\n }\n\n return runs;\n });\n\n // Computed maps for template usage\n protected readonly groupSelectionStates = computed(() => {\n const states: Record<string, 'selected' | 'partial' | 'unselected'> = {};\n for (const entry of this.displayEntries()) {\n if (entry.kind !== 'group') {\n continue;\n }\n const groupLabel = entry.label;\n const groupItems = this.filteredItems().filter(item => item.groupLabel === groupLabel);\n // Selection is counted across all members: a disabled item can still be selected, and\n // excluding it would wrongly drop the group to \"unselected\" despite a live selection.\n const hasSelection = groupItems.some(item => item.selected);\n const hasIndeterminate = groupItems.some(item => item.indeterminate);\n // \"Fully selected\" ignores members that cannot be toggled on (a disabled, unselected\n // item), so a group whose every selectable member is selected still reads as selected.\n const hasPendingSelectable = groupItems.some(item => !item.selected && !item.disabled && !item.isFeatureLocked);\n\n if (!hasSelection && !hasIndeterminate) {\n states[groupLabel] = 'unselected';\n } else if (!hasPendingSelectable && !hasIndeterminate) {\n states[groupLabel] = 'selected';\n } else {\n states[groupLabel] = 'partial';\n }\n }\n return states;\n });\n\n constructor() {\n this.symbolRegistry.withSymbols(...(inject(UI_COMPONENTS_SYMBOLS, { optional: true })?.flat() ?? []));\n this.symbolRegistry.registerSymbols([apCheck]);\n\n\n // Set up debounced search\n this.searchTermSubject.pipe(debounceTime(100), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(term => {\n const items = this.internalItems();\n this.updateFilteredItems(term?.toLowerCase() ?? '', items);\n this.announceResults(term);\n });\n\n // Feed the debounced filter pipeline from the search term signal, so the list re-filters\n // both on user typing and on an external set (a consumer resetting searchTerm to '').\n effect(() => this.searchTermSubject.next(this.searchTerm() ?? ''));\n\n // Initialize filtered items when items change\n effect(() => {\n const items = this.internalItems();\n if (!this.searchTerm()) {\n this.filteredItems.set(items);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Opens the dropdown menu at the specified trigger element */\n open(triggerElement?: HTMLElement): void {\n const panel = this.panel();\n if (this.disabled() || this.isOpen() || !panel) return;\n\n panel.open(triggerElement);\n\n // Capture initially selected items as a static snapshot\n const selectedItems = this.internalItems().filter(item => item.selected);\n this.initiallySelectedItems.set(selectedItems);\n\n this.opened.emit();\n }\n\n close(): void {\n this.panel()?.close();\n }\n\n protected onPanelClosed(): void {\n this.primed = false;\n this.activeIndex.set(-1);\n this.initiallySelectedItems.set([]);\n this.closed.emit();\n }\n\n /** Toggles the dropdown menu open or closed state */\n toggle(triggerElement?: HTMLElement): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open(triggerElement);\n }\n }\n\n /** Handles item toggle events, updating selection and emitting changes.\n * An indeterminate item resolves to selected; a definite item flips. Toggling always\n * clears the indeterminate flag, so the item becomes a definite selected/unselected. */\n onItemToggle(item: SelectionDropdownItem): void {\n if (item.disabled || item.isFeatureLocked) {\n return;\n }\n\n if (this.isSingleSelect()) {\n this.selectOnly(item);\n return;\n }\n\n const nextSelected = item.indeterminate ? true : !item.selected;\n const resolve = (i: SelectionDropdownItem): SelectionDropdownItem =>\n i.htmlId === item.htmlId ? { ...i, selected: nextSelected, indeterminate: false } : i;\n\n const updatedItems = this.internalItems().map(resolve);\n this.internalItems.set(updatedItems);\n this.selectionChange.emit(updatedItems);\n\n // Keep the filtered view in sync with the toggled item.\n this.filteredItems.update(items => items.map(resolve));\n }\n\n /** Single mode: the pick becomes the only selection, then the dropdown closes — even on a no-op pick. */\n private selectOnly(item: SelectionDropdownItem): void {\n const resolve = (i: SelectionDropdownItem): SelectionDropdownItem => ({\n ...i,\n selected: i.htmlId === item.htmlId,\n indeterminate: false,\n });\n\n const updatedItems = this.internalItems().map(resolve);\n this.internalItems.set(updatedItems);\n this.filteredItems.update(items => items.map(resolve));\n this.selectionChange.emit(updatedItems);\n this.close();\n }\n\n /** Handles footer button clicks */\n onFooterButtonClick(): void {\n this.footerButtonClick.emit();\n }\n\n\n /**\n * A search field keeps focus, so the list is marked rather than focused and the field says which\n * option through `aria-activedescendant`. Without a field, focus is the only affordance there is,\n * and the type-ahead is free — it is only a rival to a field that does the same job.\n */\n private activeManager(): ListKeyManager<DropdownOptionDirective> {\n if (!this.keyManager) {\n this.keyManager = this.searchVisible()\n ? new ActiveDescendantKeyManager(this.options, this.injector).withWrap()\n : new FocusKeyManager(this.options, this.injector).withWrap().withHomeAndEnd().withTypeAhead();\n this.keyManager.change.subscribe(index => this.activeIndex.set(index));\n // No close on `tabOut`: the rest of the dialog must stay reachable. The manager does not\n // preventDefault on Tab, so leaving it alone is enough.\n }\n return this.keyManager;\n }\n\n /** `@for` gives a per-loop index, and the options span several listboxes, so identity decides. */\n protected runKey(run: RenderRun): string {\n return run.kind === 'items' ? `items:${run.items[0]?.htmlId ?? ''}` : `group:${run.label}`;\n }\n\n /** With a search field the list is no tab stop at all: the field owns it and reaches it by arrow. */\n protected optionTabIndex(carriesIt: boolean): 0 | -1 {\n return carriesIt && !this.searchVisible() ? 0 : -1;\n }\n\n /**\n * Roving tabindex across every listbox at once: the options are a single tab stop. Before any\n * arrow key the first option carries it, or nothing in the list could be tabbed to.\n */\n protected tabbableOption(item: SelectionDropdownItem): boolean {\n const options = this.options();\n const active = this.activeIndex();\n const carrier = active >= 0 ? options[active] : options[0];\n\n return carrier?.id === this.optionId(item);\n }\n\n /** The option the search field names as active, or nothing until an arrow key marks one. */\n protected readonly activeDescendantId = computed(() => {\n const active = this.activeIndex();\n return active >= 0 ? (this.options()[active]?.id ?? null) : null;\n });\n\n /** An option needs an id of its own: the consumer's htmlId is not unique across a page. */\n protected optionId(item: SelectionDropdownItem): string {\n return `${this.listboxId}-${item.htmlId}`;\n }\n\n /**\n * The manager owns the arrows and Home/End. An option is a button, so it activates itself.\n *\n * Keys from the search field arrive here by bubbling, so only navigation crosses over: anything\n * else is the text being typed, and the manager would answer it instead of the field.\n */\n onOptionsKeyDown(event: KeyboardEvent): void {\n if (this.searchVisible()) {\n // Only the field drives the list, because only the field says which option is active.\n // Driven from the clear button or a group checkbox, the arrows would move a marker no\n // key could then commit, and no screen reader would hear.\n if (!this.fromSearchField(event)) {\n return;\n }\n if (event.key === 'Enter') {\n // The marked option has no focus of its own to answer with.\n this.activeManager().activeItem?.activate();\n event.preventDefault();\n\n return;\n }\n if (!NAVIGATION_FROM_SEARCH.has(event.key)) {\n return;\n }\n }\n\n this.activeManager().onKeydown(event);\n }\n\n /** Leaving the field ends its hold on the list: a marker nothing can commit only misleads. */\n protected onSearchBlur(): void {\n this.activeManager().setActiveItem(-1);\n }\n\n private fromSearchField(event: KeyboardEvent): boolean {\n return event.target === this.inputSearchComponent()?.inputElement().nativeElement;\n }\n\n /** Handles header button clicks */\n onHeaderButtonClick(): void {\n this.headerButtonClick.emit();\n }\n\n\n /** Handles search input changes from the rendered field. Filtering is driven by the\n * `searchTerm` effect, so this only updates the term and notifies listeners. */\n onSearchTermChange(term: string): void {\n this.searchTerm.set(term ?? '');\n this.searchInputChange.emit(term ?? '');\n }\n\n /** Handles group toggle events, selecting/deselecting all items within the group */\n onGroupToggle(groupLabel: string, checked: boolean): void {\n if (typeof checked !== 'boolean') {\n return;\n }\n const updatedItems = this.internalItems().map(item => {\n if (item.groupLabel === groupLabel && !item.disabled && !item.isFeatureLocked) {\n return { ...item, selected: checked, indeterminate: false };\n }\n return item;\n });\n this.internalItems.set(updatedItems);\n this.selectionChange.emit(updatedItems);\n }\n\n /** Stable track key for a render entry (item or group). */\n protected entryKey(entry: RenderEntry): string {\n return entry.kind === 'item' ? `item:${entry.item.htmlId}` : `group:${entry.label}`;\n }\n\n /**\n * A filtered list changes under a screen reader with nothing said, and the field keeps the focus,\n * so there is no new focus to read either. Announced after the debounce, once the count is final.\n */\n private announceResults(term: string): void {\n if (!term) {\n this.resultsAnnouncement.set('');\n\n return;\n }\n\n const count = this.filteredItems().length;\n this.resultsAnnouncement.set(count === 0 ? this.noSearchResultsText() : this.searchResultsText().replace('{count}', String(count)));\n }\n\n /** Updates the filtered items based on search term */\n private updateFilteredItems(searchTerm: string, items: SelectionDropdownItem[]): void {\n if (!searchTerm) {\n this.filteredItems.set(items);\n return;\n }\n\n const filtered = items.filter(item => item.text.toLowerCase().includes(searchTerm));\n this.filteredItems.set(filtered);\n }\n}\n","<ap-dropdown-panel\n [placement]=\"placement()\"\n [showBackdrop]=\"showBackdrop()\"\n (closed)=\"onPanelClosed()\">\n <!-- `dialog`, not a combobox: a combobox must close when focus leaves it, and this panel holds a\n search field, a header, a footer and group checkboxes beside its lists — closing on Tab left\n every one of them unreachable. -->\n <div\n *apDropdownContent\n class=\"ap-selection-dropdown__content\"\n role=\"dialog\"\n tabindex=\"-1\"\n [attr.aria-label]=\"panelLabel()\"\n (keydown)=\"onOptionsKeyDown($event)\"\n [class.ap-selection-dropdown__content--single]=\"isSingleSelect()\">\n <!-- Header -->\n @if (headerVisible()) {\n <div class=\"ap-selection-dropdown__header\">\n @if (headerTopVisible()) {\n <div class=\"ap-selection-dropdown__header-top\">\n @if (title()) {\n <h3 class=\"ap-selection-dropdown__title\">\n {{ title() }}\n </h3>\n }\n @if (headerButtonText()) {\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"headerButtonId()\"\n (click)=\"onHeaderButtonClick()\">\n <ap-symbol [symbolId]=\"headerButtonSymbolId()\" />\n {{ headerButtonText() }}\n </button>\n }\n </div>\n }\n @if (searchVisible()) {\n <ap-input-search\n #inputSearchElement\n [placeholder]=\"searchPlaceholderText()\"\n [clearable]=\"true\"\n [ariaControls]=\"listboxId\"\n [ariaActiveDescendant]=\"activeDescendantId()\"\n [ngModel]=\"searchTerm()\"\n (blur)=\"onSearchBlur()\"\n (ngModelChange)=\"onSearchTermChange($event)\" />\n }\n </div>\n }\n\n <!-- Selection dropdown items -->\n <div\n class=\"ap-selection-dropdown__items\"\n [id]=\"listboxId\"\n [attr.role]=\"isSingleSelect() ? 'listbox' : null\"\n [attr.aria-label]=\"isSingleSelect() ? (title() ?? null) : null\">\n @if (filteredItems().length === 0 && searchTerm()) {\n <div class=\"ap-selection-dropdown__no-results\">\n {{ noSearchResultsText() }}\n </div>\n } @else if (isSingleSelect()) {\n @for (item of filteredItems(); track item.htmlId) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__option\"\n [id]=\"optionId(item)\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [tabindex]=\"optionTabIndex(activeIndex() === $index)\"\n [attr.aria-selected]=\"item.selected\"\n [attr.aria-disabled]=\"item.disabled || item.isFeatureLocked\"\n [attr.data-track]=\"item.dataTrack\"\n [apTooltip]=\"item.disabled ? (item.disabledTooltip ?? null) : null\"\n apTooltipPosition=\"right\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-single-one-line\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [standaloneModeEnabled]=\"true\" />\n </button>\n }\n } @else {\n <!-- A listbox owns only options, so each section is its own, and a group's checkbox sits beside it. -->\n @if (selectedItems().length > 0) {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n class=\"ap-selection-dropdown__selected-section\"\n [attr.aria-label]=\"selectedSectionText()\">\n @for (item of selectedItems(); track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n }\n\n <!-- Unselected zone: items & groups in first-encounter order -->\n @for (run of displayRuns(); track runKey(run)) {\n @if (run.kind === 'items') {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"title() ?? optionsSectionText()\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n } @else {\n <div class=\"ap-selection-dropdown__group\">\n <!-- Group header with checkbox -->\n <div class=\"ap-selection-dropdown__group-header\">\n <div class=\"ap-selection-dropdown__group-label\">\n <ap-checkbox\n class=\"centered\"\n [name]=\"run.label\"\n [checked]=\"groupSelectionStates()[run.label] === 'selected'\"\n [indeterminate]=\"groupSelectionStates()[run.label] === 'partial'\"\n (change)=\"onGroupToggle(run.label, $event)\">\n {{ run.label }}\n </ap-checkbox>\n </div>\n </div>\n\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"run.label\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = true;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n </div>\n }\n }\n }\n </div>\n\n <div\n class=\"ap-selection-dropdown__status\"\n role=\"status\"\n aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n\n <!-- Footer -->\n @if (footerButtonText()) {\n <div class=\"ap-selection-dropdown__footer\">\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"footerButtonId()\"\n (click)=\"onFooterButtonClick()\">\n <ap-symbol [symbolId]=\"footerButtonSymbolId()\" />\n {{ footerButtonText() }}\n </button>\n </div>\n }\n </div>\n</ap-dropdown-panel>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agorapulse-ui-components-selection-dropdown.mjs","sources":["../../../libs/ui-components/selection-dropdown/src/selection-dropdown-trigger.directive.ts","../../../libs/ui-components/selection-dropdown/src/selection-dropdown.component.ts","../../../libs/ui-components/selection-dropdown/src/selection-dropdown.component.html","../../../libs/ui-components/selection-dropdown/src/agorapulse-ui-components-selection-dropdown.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, inject, input } from '@angular/core';\nimport { SelectionDropdownComponent } from './selection-dropdown.component';\n\n/**\n * Directive that turns any element into a trigger for a SelectionDropdown component.\n * Handles click and keyboard interactions to open/close the dropdown.\n */\n@Directive({\n selector: '[apSelectionDropdownTrigger]',\n})\nexport class SelectionDropdownTriggerDirective {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** Reference to the SelectionDropdown component that this trigger controls */\n apSelectionDropdownTrigger = input.required<SelectionDropdownComponent>();\n\n /** Prevents the trigger from opening/toggling the dropdown when true */\n apSelectionDropdownTriggerDisable = input(false);\n\n /** Handles click events to toggle the dropdown */\n @HostListener('click', ['$event'])\n onClick(event: MouseEvent): void {\n if (this.apSelectionDropdownTriggerDisable()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n this.apSelectionDropdownTrigger().toggle(this.elementRef.nativeElement);\n }\n\n /** Handles keyboard events for accessibility (Enter, Space, Arrow Down, Escape) */\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const dropdown = this.apSelectionDropdownTrigger();\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n if (this.apSelectionDropdownTriggerDisable()) return;\n event.preventDefault();\n dropdown.open(this.elementRef.nativeElement);\n break;\n\n case 'Escape':\n event.preventDefault();\n dropdown.close();\n break;\n }\n }\n}\n","import { CheckboxComponent } from '@agorapulse/ui-components/checkbox';\nimport { ActiveDescendantKeyManager, FocusKeyManager, ListKeyManager } from '@angular/cdk/a11y';\nimport { DropdownOptionDirective, DropdownOverlay } from '@agorapulse/ui-components/dropdown-base';\nimport { DropdownContentDirective, DropdownPanelComponent } from '@agorapulse/ui-components/dropdown-panel';\nimport { FloatingPlacement } from '@agorapulse/ui-components/floating';\nimport { InputSearchComponent } from '@agorapulse/ui-components/input-search';\nimport { UI_COMPONENTS_SYMBOLS } from '@agorapulse/ui-components/providers';\nimport { DropdownItemMultipleOneLineComponent, DropdownItemSingleOneLineComponent } from '@agorapulse/ui-components/select';\nimport { TooltipDirective } from '@agorapulse/ui-components/tooltip';\nimport { apCheck, SymbolComponent, SymbolRegistry } from '@agorapulse/ui-symbol';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n OnDestroy,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs';\n\n/** The only keys a search field hands to the list: Home and End belong to the caret, not the options. */\nconst NAVIGATION_FROM_SEARCH = new Set(['ArrowUp', 'ArrowDown']);\n\nexport interface SelectionDropdownItem {\n /** Unique HTML ID for the item */\n htmlId: string;\n /** Display text for the item */\n text: string;\n /** Whether the item is selected */\n selected: boolean;\n /** Whether the item is displayed in a mixed/indeterminate state. Takes visual precedence over `selected`. */\n indeterminate?: boolean;\n /** Whether the item is disabled and non-interactive */\n disabled?: boolean;\n /** Avatar URL to display */\n avatarUrl?: string;\n /** Symbol ID to display */\n symbolId?: string;\n /** Tooltip text displayed when item is disabled */\n disabledTooltip?: string;\n /** Text displayed in a badge next to the item */\n badgeText?: string;\n /** Whether the feature is locked */\n isFeatureLocked?: boolean;\n /** Whether avatar should be rounded */\n roundedAvatar?: boolean;\n /** Avatar network type */\n network?: any;\n /** Symbol color */\n symbolColor?: string;\n /** Symbol tooltip text */\n symbolTooltipText?: string;\n /** Group label - items with the same groupLabel will be grouped together */\n groupLabel?: string;\n dataTrack?: string;\n}\n\n/**\n * One rendered row in the unselected zone: either a standalone item or a group\n * holding the items that belong to it (in first-encounter order).\n */\ntype RenderEntry = { kind: 'item'; item: SelectionDropdownItem } | { kind: 'group'; label: string; items: SelectionDropdownItem[] };\n\n/** A run of consecutive ungrouped items, or a group. Each becomes one listbox of its own. */\ntype RenderRun = { kind: 'items'; items: SelectionDropdownItem[] } | Extract<RenderEntry, { kind: 'group' }>;\n\nexport type SelectionDropdownMode = 'multiple' | 'single';\n\n/** A dropdown of options on any trigger. `multiple` = checkbox rows with search; `single` = rows, closes on pick. */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'ap-selection-dropdown',\n templateUrl: './selection-dropdown.component.html',\n styleUrls: ['./selection-dropdown.component.scss'],\n imports: [\n CheckboxComponent,\n DropdownContentDirective,\n DropdownOptionDirective,\n DropdownItemMultipleOneLineComponent,\n DropdownItemSingleOneLineComponent,\n DropdownPanelComponent,\n FormsModule,\n InputSearchComponent,\n SymbolComponent,\n TooltipDirective,\n ],\n})\nexport class SelectionDropdownComponent implements DropdownOverlay, OnDestroy {\n private static nextId = 0;\n\n private readonly symbolRegistry = inject(SymbolRegistry);\n private readonly panel = viewChild(DropdownPanelComponent);\n private readonly options = viewChildren(DropdownOptionDirective);\n\n /** Mirrors the key manager's active index, so the roving tabindex can be bound. */\n protected readonly activeIndex = signal(-1);\n\n private readonly injector = inject(Injector);\n\n /** Names the dialog. Falls back to the visible title, then to a generic label rather than none. */\n readonly ariaLabel = input<string>();\n\n /** Names the listbox holding what is already selected. */\n readonly selectedSectionText = input('Selected');\n\n /** Names a listbox of ungrouped options when the dropdown has no title. */\n readonly optionsSectionText = input('Options');\n\n protected readonly panelLabel = computed(() => this.ariaLabel() ?? this.title() ?? 'Selection');\n\n protected readonly listboxId = `ap-selection-dropdown-list-${SelectionDropdownComponent.nextId++}`;\n\n private keyManager: ListKeyManager<DropdownOptionDirective> | null = null;\n private primed = false;\n\n trigger = contentChild<TemplateRef<unknown>>('trigger');\n\n /** ID for the header button */\n headerButtonId = input<string>();\n /** ID for the footer button */\n footerButtonId = input<string>();\n /** Array of items to display in the dropdown menu */\n items = input<SelectionDropdownItem[]>([]);\n /** Whether several options can be active at once, or exactly one. */\n selectionMode = input<SelectionDropdownMode>('multiple');\n /** Shows the search field. Ignored in `multiple` mode, which always searches. */\n searchEnabled = input(false);\n /** Title to display in the header */\n title = input<string>();\n /** Text for the footer button */\n footerButtonText = input<string>();\n /** Symbol ID for the footer button */\n footerButtonSymbolId = input<string>();\n /** Text for the header button */\n headerButtonText = input<string>();\n /** Symbol ID for the header button */\n headerButtonSymbolId = input<string>();\n /** Placeholder text for the search input */\n searchPlaceholderText = input('Search');\n /** Text to display when no search results are found */\n noSearchResultsText = input('No results found');\n\n /** Announced once a search settles. `{count}` is replaced by how many options matched. */\n searchResultsText = input('{count} results');\n\n /** Whether to show a backdrop that closes the dropdown when clicked */\n showBackdrop = input(true);\n /** Whether the dropdown is disabled and cannot be opened */\n disabled = input(false);\n /** Default position for the dropdown relative to the trigger element */\n /** Panel placement. Unset means derived from the anchor mode, i.e. `bottom-start`. */\n readonly placement = input<FloatingPlacement>();\n\n /** Emits when the dropdown menu is opened */\n opened = output<void>();\n /** Emits when the dropdown menu is closed */\n closed = output<void>();\n /** Emits when a dropdown item selection changes */\n selectionChange = output<SelectionDropdownItem[]>();\n /** Emits when the footer button is clicked */\n footerButtonClick = output<void>();\n /** Emits when the header button is clicked */\n headerButtonClick = output<void>();\n /** Emits when the search input is changed */\n searchInputChange = output<string>();\n\n /**\n * Two-way bindable, clearable search term. Consumers can read it and reset it (set to '')\n * to clear the search and restore the full item list — letting them drive the search\n * declaratively instead of reaching into the rendered `ap-input-search`.\n */\n readonly searchTerm = model<string>('');\n\n private readonly destroy$ = new Subject<void>();\n private readonly searchTermSubject = new Subject<string>();\n\n protected readonly inputSearchComponent = viewChild<InputSearchComponent>('inputSearchElement');\n\n readonly isOpen = computed(() => this.panel()?.isOpen() ?? false);\n\n focusInput = effect(() => {\n const inputSearch = this.inputSearchComponent();\n untracked(() => {\n if (this.isOpen() && inputSearch) {\n inputSearch.focusInput();\n }\n });\n });\n\n /** Single-select opens on its first option; multi does not, since marking one the user never chose announces a selection. */\n primeOptions = effect(() => {\n const open = this.isOpen();\n const options = this.options();\n untracked(() => {\n if (open && options.length > 0 && !this.primed && this.isSingleSelect()) {\n this.primed = true;\n this.activeManager().setFirstItemActive();\n }\n });\n });\n\n protected readonly isSingleSelect = computed(() => this.selectionMode() === 'single');\n\n /** Always true in `multiple` mode, leaving that layout untouched; only `single` collapses the header. */\n protected readonly searchVisible = computed(() => !this.isSingleSelect() || this.searchEnabled());\n protected readonly headerTopVisible = computed(() => !this.isSingleSelect() || !!this.title() || !!this.headerButtonText());\n protected readonly headerVisible = computed(() => this.headerTopVisible() || this.searchVisible());\n\n private readonly internalItems = linkedSignal(() => this.items());\n\n protected readonly filteredItems = signal<SelectionDropdownItem[]>([]);\n\n /** What the live region holds. Empty outside a search: the list is on screen, unchanged. */\n protected readonly resultsAnnouncement = signal('');\n protected readonly initiallySelectedItems = signal<SelectionDropdownItem[]>([]);\n\n // Computed properties for template usage\n protected readonly selectedItems = computed(() => {\n const initiallySelectedIds = this.initiallySelectedItems().map(item => item.htmlId);\n return this.filteredItems().filter(item => initiallySelectedIds.includes(item.htmlId));\n });\n\n protected readonly unselectedItems = computed(() => {\n const initiallySelectedIds = this.initiallySelectedItems().map(item => item.htmlId);\n return this.filteredItems().filter(item => !initiallySelectedIds.includes(item.htmlId));\n });\n\n /**\n * Unselected items rebuilt into a single ordered list: standalone items and\n * groups appear in the order their first item is encountered; later items of\n * an already-seen group join that existing group entry.\n */\n protected readonly displayEntries = computed<RenderEntry[]>(() => {\n const entries: RenderEntry[] = [];\n const groupsByLabel = new Map<string, Extract<RenderEntry, { kind: 'group' }>>();\n\n for (const item of this.unselectedItems()) {\n const label = item.groupLabel;\n if (!label) {\n entries.push({ kind: 'item', item });\n continue;\n }\n\n const existing = groupsByLabel.get(label);\n if (existing) {\n // `existing` is the same object reference already pushed into `entries`,\n // so mutating its items array updates the rendered group in place.\n existing.items.push(item);\n } else {\n const group: Extract<RenderEntry, { kind: 'group' }> = { kind: 'group', label, items: [item] };\n groupsByLabel.set(label, group);\n entries.push(group);\n }\n }\n\n return entries;\n });\n\n /**\n * A listbox owns only options, so a group's checkbox cannot sit inside one: each group gets its own\n * listbox, and the ungrouped items between two groups are collected into one rather than one each.\n */\n protected readonly displayRuns = computed<RenderRun[]>(() => {\n const runs: RenderRun[] = [];\n\n for (const entry of this.displayEntries()) {\n if (entry.kind === 'group') {\n runs.push(entry);\n continue;\n }\n\n const last = runs[runs.length - 1];\n if (last?.kind === 'items') {\n last.items.push(entry.item);\n } else {\n runs.push({ kind: 'items', items: [entry.item] });\n }\n }\n\n return runs;\n });\n\n // Computed maps for template usage\n protected readonly groupSelectionStates = computed(() => {\n const states: Record<string, 'selected' | 'partial' | 'unselected'> = {};\n for (const entry of this.displayEntries()) {\n if (entry.kind !== 'group') {\n continue;\n }\n const groupLabel = entry.label;\n const groupItems = this.filteredItems().filter(item => item.groupLabel === groupLabel);\n // Selection is counted across all members: a disabled item can still be selected, and\n // excluding it would wrongly drop the group to \"unselected\" despite a live selection.\n const hasSelection = groupItems.some(item => item.selected);\n const hasIndeterminate = groupItems.some(item => item.indeterminate);\n // \"Fully selected\" ignores members that cannot be toggled on (a disabled, unselected\n // item), so a group whose every selectable member is selected still reads as selected.\n const hasPendingSelectable = groupItems.some(item => !item.selected && !item.disabled && !item.isFeatureLocked);\n\n if (!hasSelection && !hasIndeterminate) {\n states[groupLabel] = 'unselected';\n } else if (!hasPendingSelectable && !hasIndeterminate) {\n states[groupLabel] = 'selected';\n } else {\n states[groupLabel] = 'partial';\n }\n }\n return states;\n });\n\n constructor() {\n this.symbolRegistry.withSymbols(...(inject(UI_COMPONENTS_SYMBOLS, { optional: true })?.flat() ?? []));\n this.symbolRegistry.registerSymbols([apCheck]);\n\n\n // Set up debounced search\n this.searchTermSubject.pipe(debounceTime(100), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(term => {\n const items = this.internalItems();\n this.updateFilteredItems(term?.toLowerCase() ?? '', items);\n this.announceResults(term);\n });\n\n // Feed the debounced filter pipeline from the search term signal, so the list re-filters\n // both on user typing and on an external set (a consumer resetting searchTerm to '').\n effect(() => this.searchTermSubject.next(this.searchTerm() ?? ''));\n\n // Initialize filtered items when items change\n effect(() => {\n const items = this.internalItems();\n if (!this.searchTerm()) {\n this.filteredItems.set(items);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Opens the dropdown menu at the specified trigger element */\n open(triggerElement?: HTMLElement): void {\n const panel = this.panel();\n if (this.disabled() || this.isOpen() || !panel) return;\n\n panel.open(triggerElement);\n\n // Capture initially selected items as a static snapshot\n const selectedItems = this.internalItems().filter(item => item.selected);\n this.initiallySelectedItems.set(selectedItems);\n\n this.opened.emit();\n }\n\n close(): void {\n this.panel()?.close();\n }\n\n protected onPanelClosed(): void {\n this.primed = false;\n this.activeIndex.set(-1);\n this.initiallySelectedItems.set([]);\n this.closed.emit();\n }\n\n /** Toggles the dropdown menu open or closed state */\n toggle(triggerElement?: HTMLElement): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open(triggerElement);\n }\n }\n\n /** Handles item toggle events, updating selection and emitting changes.\n * An indeterminate item resolves to selected; a definite item flips. Toggling always\n * clears the indeterminate flag, so the item becomes a definite selected/unselected. */\n onItemToggle(item: SelectionDropdownItem): void {\n if (item.disabled || item.isFeatureLocked) {\n return;\n }\n\n if (this.isSingleSelect()) {\n this.selectOnly(item);\n return;\n }\n\n const nextSelected = item.indeterminate ? true : !item.selected;\n const resolve = (i: SelectionDropdownItem): SelectionDropdownItem =>\n i.htmlId === item.htmlId ? { ...i, selected: nextSelected, indeterminate: false } : i;\n\n const updatedItems = this.internalItems().map(resolve);\n this.internalItems.set(updatedItems);\n this.selectionChange.emit(updatedItems);\n\n // Keep the filtered view in sync with the toggled item.\n this.filteredItems.update(items => items.map(resolve));\n }\n\n /** Single mode: the pick becomes the only selection, then the dropdown closes — even on a no-op pick. */\n private selectOnly(item: SelectionDropdownItem): void {\n const resolve = (i: SelectionDropdownItem): SelectionDropdownItem => ({\n ...i,\n selected: i.htmlId === item.htmlId,\n indeterminate: false,\n });\n\n const updatedItems = this.internalItems().map(resolve);\n this.internalItems.set(updatedItems);\n this.filteredItems.update(items => items.map(resolve));\n this.selectionChange.emit(updatedItems);\n this.close();\n }\n\n /** Handles footer button clicks */\n onFooterButtonClick(): void {\n this.footerButtonClick.emit();\n }\n\n\n /**\n * A search field keeps focus, so the list is marked rather than focused and the field says which\n * option through `aria-activedescendant`. Without a field, focus is the only affordance there is,\n * and the type-ahead is free — it is only a rival to a field that does the same job.\n */\n private activeManager(): ListKeyManager<DropdownOptionDirective> {\n if (!this.keyManager) {\n this.keyManager = this.searchVisible()\n ? new ActiveDescendantKeyManager(this.options, this.injector).withWrap()\n : new FocusKeyManager(this.options, this.injector).withWrap().withHomeAndEnd().withTypeAhead();\n this.keyManager.change.subscribe(index => this.activeIndex.set(index));\n // No close on `tabOut`: the rest of the dialog must stay reachable. The manager does not\n // preventDefault on Tab, so leaving it alone is enough.\n }\n return this.keyManager;\n }\n\n /** `@for` gives a per-loop index, and the options span several listboxes, so identity decides. */\n protected runKey(run: RenderRun): string {\n return run.kind === 'items' ? `items:${run.items[0]?.htmlId ?? ''}` : `group:${run.label}`;\n }\n\n /** With a search field the list is no tab stop at all: the field owns it and reaches it by arrow. */\n protected optionTabIndex(carriesIt: boolean): 0 | -1 {\n return carriesIt && !this.searchVisible() ? 0 : -1;\n }\n\n /**\n * Roving tabindex across every listbox at once: the options are a single tab stop. Before any\n * arrow key the first option carries it, or nothing in the list could be tabbed to.\n */\n protected tabbableOption(item: SelectionDropdownItem): boolean {\n const options = this.options();\n const active = this.activeIndex();\n const carrier = active >= 0 ? options[active] : options[0];\n\n return carrier?.id === this.optionId(item);\n }\n\n /** The option the search field names as active, or nothing until an arrow key marks one. */\n protected readonly activeDescendantId = computed(() => {\n const active = this.activeIndex();\n return active >= 0 ? (this.options()[active]?.id ?? null) : null;\n });\n\n /** An option needs an id of its own: the consumer's htmlId is not unique across a page. */\n protected optionId(item: SelectionDropdownItem): string {\n return `${this.listboxId}-${item.htmlId}`;\n }\n\n /**\n * The manager owns the arrows and Home/End. An option is a button, so it activates itself.\n *\n * Keys from the search field arrive here by bubbling, so only navigation crosses over: anything\n * else is the text being typed, and the manager would answer it instead of the field.\n */\n onOptionsKeyDown(event: KeyboardEvent): void {\n if (this.searchVisible()) {\n // Only the field drives the list, because only the field says which option is active.\n // Driven from the clear button or a group checkbox, the arrows would move a marker no\n // key could then commit, and no screen reader would hear.\n if (!this.fromSearchField(event)) {\n return;\n }\n if (event.key === 'Enter') {\n // The marked option has no focus of its own to answer with.\n this.activeManager().activeItem?.activate();\n event.preventDefault();\n\n return;\n }\n if (!NAVIGATION_FROM_SEARCH.has(event.key)) {\n return;\n }\n }\n\n this.activeManager().onKeydown(event);\n }\n\n /** Leaving the field ends its hold on the list: a marker nothing can commit only misleads. */\n protected onSearchBlur(): void {\n this.activeManager().setActiveItem(-1);\n }\n\n private fromSearchField(event: KeyboardEvent): boolean {\n return event.target === this.inputSearchComponent()?.inputElement().nativeElement;\n }\n\n /** Handles header button clicks */\n onHeaderButtonClick(): void {\n this.headerButtonClick.emit();\n }\n\n\n /** Handles search input changes from the rendered field. Filtering is driven by the\n * `searchTerm` effect, so this only updates the term and notifies listeners. */\n onSearchTermChange(term: string): void {\n this.searchTerm.set(term ?? '');\n this.searchInputChange.emit(term ?? '');\n }\n\n /** Handles group toggle events, selecting/deselecting all items within the group */\n onGroupToggle(groupLabel: string, checked: boolean): void {\n if (typeof checked !== 'boolean') {\n return;\n }\n const updatedItems = this.internalItems().map(item => {\n if (item.groupLabel === groupLabel && !item.disabled && !item.isFeatureLocked) {\n return { ...item, selected: checked, indeterminate: false };\n }\n return item;\n });\n this.internalItems.set(updatedItems);\n this.selectionChange.emit(updatedItems);\n }\n\n /** Stable track key for a render entry (item or group). */\n protected entryKey(entry: RenderEntry): string {\n return entry.kind === 'item' ? `item:${entry.item.htmlId}` : `group:${entry.label}`;\n }\n\n /**\n * A filtered list changes under a screen reader with nothing said, and the field keeps the focus,\n * so there is no new focus to read either. Announced after the debounce, once the count is final.\n */\n private announceResults(term: string): void {\n if (!term) {\n this.resultsAnnouncement.set('');\n\n return;\n }\n\n const count = this.filteredItems().length;\n this.resultsAnnouncement.set(count === 0 ? this.noSearchResultsText() : this.searchResultsText().replace('{count}', String(count)));\n }\n\n /** Updates the filtered items based on search term */\n private updateFilteredItems(searchTerm: string, items: SelectionDropdownItem[]): void {\n if (!searchTerm) {\n this.filteredItems.set(items);\n return;\n }\n\n const filtered = items.filter(item => item.text.toLowerCase().includes(searchTerm));\n this.filteredItems.set(filtered);\n }\n}\n","<ap-dropdown-panel\n [placement]=\"placement()\"\n [showBackdrop]=\"showBackdrop()\"\n (closed)=\"onPanelClosed()\">\n <!-- `dialog`, not a combobox: a combobox must close when focus leaves it, and this panel holds a\n search field, a header, a footer and group checkboxes beside its lists — closing on Tab left\n every one of them unreachable. -->\n <div\n *apDropdownContent\n class=\"ap-selection-dropdown__content\"\n role=\"dialog\"\n tabindex=\"-1\"\n [attr.aria-label]=\"panelLabel()\"\n (keydown)=\"onOptionsKeyDown($event)\"\n [class.ap-selection-dropdown__content--single]=\"isSingleSelect()\">\n <!-- Header -->\n @if (headerVisible()) {\n <div class=\"ap-selection-dropdown__header\">\n @if (headerTopVisible()) {\n <div class=\"ap-selection-dropdown__header-top\">\n @if (title()) {\n <h3 class=\"ap-selection-dropdown__title\">\n {{ title() }}\n </h3>\n }\n @if (headerButtonText()) {\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"headerButtonId()\"\n (click)=\"onHeaderButtonClick()\">\n <ap-symbol [symbolId]=\"headerButtonSymbolId()\" />\n {{ headerButtonText() }}\n </button>\n }\n </div>\n }\n @if (searchVisible()) {\n <ap-input-search\n #inputSearchElement\n [placeholder]=\"searchPlaceholderText()\"\n [clearable]=\"true\"\n [ariaControls]=\"listboxId\"\n [ariaActiveDescendant]=\"activeDescendantId()\"\n [ngModel]=\"searchTerm()\"\n (blur)=\"onSearchBlur()\"\n (ngModelChange)=\"onSearchTermChange($event)\" />\n }\n </div>\n }\n\n <!-- Selection dropdown items -->\n <div\n class=\"ap-selection-dropdown__items\"\n [id]=\"listboxId\"\n [attr.role]=\"isSingleSelect() ? 'listbox' : null\"\n [attr.aria-label]=\"isSingleSelect() ? (title() ?? null) : null\">\n @if (filteredItems().length === 0 && searchTerm()) {\n <div class=\"ap-selection-dropdown__no-results\">\n {{ noSearchResultsText() }}\n </div>\n } @else if (isSingleSelect()) {\n @for (item of filteredItems(); track item.htmlId) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__option\"\n [id]=\"optionId(item)\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [tabindex]=\"optionTabIndex(activeIndex() === $index)\"\n [attr.aria-selected]=\"item.selected\"\n [attr.aria-disabled]=\"item.disabled || item.isFeatureLocked\"\n [attr.data-track]=\"item.dataTrack\"\n [apTooltip]=\"item.disabled ? (item.disabledTooltip ?? null) : null\"\n apTooltipPosition=\"right\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-single-one-line\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [standaloneModeEnabled]=\"true\" />\n </button>\n }\n } @else {\n <!-- A listbox owns only options, so each section is its own, and a group's checkbox sits beside it. -->\n @if (selectedItems().length > 0) {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n class=\"ap-selection-dropdown__selected-section\"\n [attr.aria-label]=\"selectedSectionText()\">\n @for (item of selectedItems(); track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n }\n\n <!-- Unselected zone: items & groups in first-encounter order -->\n @for (run of displayRuns(); track runKey(run)) {\n @if (run.kind === 'items') {\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"title() ?? optionsSectionText()\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = false;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n } @else {\n <div class=\"ap-selection-dropdown__group\">\n <!-- Group header with checkbox -->\n <div class=\"ap-selection-dropdown__group-header\">\n <div class=\"ap-selection-dropdown__group-label\">\n <ap-checkbox\n class=\"centered\"\n [name]=\"run.label\"\n [checked]=\"groupSelectionStates()[run.label] === 'selected'\"\n [indeterminate]=\"groupSelectionStates()[run.label] === 'partial'\"\n (change)=\"onGroupToggle(run.label, $event)\">\n {{ run.label }}\n </ap-checkbox>\n </div>\n </div>\n\n <div\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"run.label\">\n @for (item of run.items; track item.htmlId) {\n @let grouped = true;\n <button\n type=\"button\"\n role=\"option\"\n class=\"ap-selection-dropdown__item-button\"\n [id]=\"optionId(item)\"\n [tabindex]=\"optionTabIndex(tabbableOption(item))\"\n [apDropdownOption]=\"item.text\"\n [apDropdownOptionDisabled]=\"!!(item.disabled || item.isFeatureLocked)\"\n [attr.aria-selected]=\"item.selected\"\n [class.ap-selection-dropdown__item-button--disabled]=\"item.disabled || item.isFeatureLocked\"\n [apTooltip]=\"item.disabledTooltip\"\n (click)=\"onItemToggle(item)\">\n <ap-dropdown-item-multiple-one-line\n presentational\n class=\"ap-selection-dropdown__item\"\n [class.ap-selection-dropdown__item--grouped]=\"grouped\"\n [text]=\"item.text\"\n [selected]=\"item.selected\"\n [indeterminate]=\"item.indeterminate ?? false\"\n [htmlId]=\"item.htmlId\"\n [disabled]=\"item.disabled || false\"\n [avatarUrl]=\"item.avatarUrl\"\n [symbolId]=\"item.symbolId\"\n [badgeText]=\"item.badgeText\"\n [isFeatureLocked]=\"item.isFeatureLocked || false\"\n [roundedAvatar]=\"!!item.roundedAvatar\"\n [network]=\"item.network\"\n [symbolColor]=\"item.symbolColor\"\n [symbolTooltipText]=\"item.symbolTooltipText\" />\n </button>\n }\n </div>\n </div>\n }\n }\n }\n </div>\n\n <div\n class=\"ap-selection-dropdown__status\"\n role=\"status\"\n aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n\n <!-- Footer -->\n @if (footerButtonText()) {\n <div class=\"ap-selection-dropdown__footer\">\n <button\n type=\"button\"\n class=\"ap-link standalone\"\n [id]=\"footerButtonId()\"\n (click)=\"onFooterButtonClick()\">\n <ap-symbol [symbolId]=\"footerButtonSymbolId()\" />\n {{ footerButtonText() }}\n </button>\n </div>\n }\n </div>\n</ap-dropdown-panel>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|