|
17 | 17 | afterRenderEffect, |
18 | 18 | <span class="hljs-title class_">ChangeDetectionStrategy</span>, |
19 | 19 | <span class="hljs-title class_">Component</span>, |
20 | | - <span class="hljs-title class_">ElementRef</span>, |
21 | 20 | signal, |
22 | 21 | viewChild, |
| 22 | + viewChildren, |
23 | 23 | } <span class="hljs-keyword">from</span> <span class="hljs-string">'@angular/core'</span>; |
24 | | -<span class="hljs-keyword">import</span> {<span class="hljs-title class_">FormsModule</span>} <span class="hljs-keyword">from</span> <span class="hljs-string">'@angular/forms'</span>; |
| 24 | +<span class="hljs-keyword">import</span> {<span class="hljs-title class_">OverlayModule</span>} <span class="hljs-keyword">from</span> <span class="hljs-string">'@angular/cdk/overlay'</span>; |
25 | 25 |
|
26 | 26 | <span class="hljs-comment">/** <span class="hljs-doctag">@title</span> Disabled readonly combobox. */</span> |
27 | 27 | <span class="hljs-meta">@Component</span>({ |
28 | 28 | <span class="hljs-attr">selector</span>: <span class="hljs-string">'combobox-readonly-disabled-example'</span>, |
29 | 29 | <span class="hljs-attr">templateUrl</span>: <span class="hljs-string">'combobox-readonly-disabled-example.html'</span>, |
30 | | - <span class="hljs-attr">styleUrl</span>: <span class="hljs-string">'../combobox-examples.css'</span>, |
| 30 | + <span class="hljs-attr">styleUrl</span>: <span class="hljs-string">'../select-examples.css'</span>, |
31 | 31 | <span class="hljs-attr">imports</span>: [ |
32 | 32 | <span class="hljs-title class_">Combobox</span>, |
33 | 33 | <span class="hljs-title class_">ComboboxInput</span>, |
34 | 34 | <span class="hljs-title class_">ComboboxPopup</span>, |
35 | 35 | <span class="hljs-title class_">ComboboxPopupContainer</span>, |
36 | 36 | <span class="hljs-title class_">Listbox</span>, |
37 | 37 | <span class="hljs-title class_">Option</span>, |
38 | | - <span class="hljs-title class_">FormsModule</span>, |
| 38 | + <span class="hljs-title class_">OverlayModule</span>, |
39 | 39 | ], |
40 | 40 | <span class="hljs-attr">changeDetection</span>: <span class="hljs-title class_">ChangeDetectionStrategy</span>.<span class="hljs-property">OnPush</span>, |
41 | 41 | }) |
42 | 42 | <span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ComboboxReadonlyDisabledExample</span> { |
43 | | - popover = viewChild<<span class="hljs-title class_">ElementRef</span>>(<span class="hljs-string">'popover'</span>); |
44 | | - listbox = viewChild<<span class="hljs-title class_">Listbox</span><<span class="hljs-built_in">any</span>>>(<span class="hljs-title class_">Listbox</span>); |
45 | | - combobox = viewChild<<span class="hljs-title class_">Combobox</span><<span class="hljs-built_in">any</span>>>(<span class="hljs-title class_">Combobox</span>); |
| 43 | + <span class="hljs-comment">/** The string that is displayed in the combobox. */</span> |
| 44 | + displayValue = <span class="hljs-title function_">signal</span>(<span class="hljs-string">''</span>); |
46 | 45 |
|
47 | | - options = <span class="hljs-function">() =></span> states; |
48 | | - searchString = <span class="hljs-title function_">signal</span>(<span class="hljs-string">''</span>); |
| 46 | + <span class="hljs-comment">/** The combobox listbox popup. */</span> |
| 47 | + listbox = viewChild<<span class="hljs-title class_">Listbox</span><<span class="hljs-built_in">string</span>>>(<span class="hljs-title class_">Listbox</span>); |
49 | 48 |
|
50 | | - <span class="hljs-title function_">constructor</span>(<span class="hljs-params"></span>) { |
51 | | - <span class="hljs-title function_">afterRenderEffect</span>(<span class="hljs-function">() =></span> { |
52 | | - <span class="hljs-keyword">const</span> popover = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">popover</span>()!; |
53 | | - <span class="hljs-keyword">const</span> combobox = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">combobox</span>()!; |
54 | | - combobox.<span class="hljs-title function_">expanded</span>() ? <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">showPopover</span>() : popover.<span class="hljs-property">nativeElement</span>.<span class="hljs-title function_">hidePopover</span>(); |
| 49 | + <span class="hljs-comment">/** The options available in the listbox. */</span> |
| 50 | + options = viewChildren<<span class="hljs-title class_">Option</span><<span class="hljs-built_in">string</span>>>(<span class="hljs-title class_">Option</span>); |
55 | 51 |
|
56 | | - <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">listbox</span>()?.<span class="hljs-title function_">scrollActiveItemIntoView</span>(); |
57 | | - }); |
58 | | - } |
| 52 | + <span class="hljs-comment">/** A reference to the ng aria combobox. */</span> |
| 53 | + combobox = viewChild<<span class="hljs-title class_">Combobox</span><<span class="hljs-built_in">string</span>>>(<span class="hljs-title class_">Combobox</span>); |
59 | 54 |
|
60 | | - <span class="hljs-title function_">showPopover</span>(<span class="hljs-params"></span>) { |
61 | | - <span class="hljs-keyword">const</span> popover = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">popover</span>()!; |
62 | | - <span class="hljs-keyword">const</span> combobox = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">combobox</span>()!; |
| 55 | + <span class="hljs-comment">/** The labels that are available for selection. */</span> |
| 56 | + labels = [ |
| 57 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Important'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'label'</span>}, |
| 58 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Starred'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'star'</span>}, |
| 59 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Work'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'work'</span>}, |
| 60 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Personal'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'person'</span>}, |
| 61 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'To Do'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'checklist'</span>}, |
| 62 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Later'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'schedule'</span>}, |
| 63 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Read'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'menu_book'</span>}, |
| 64 | + {<span class="hljs-attr">value</span>: <span class="hljs-string">'Travel'</span>, <span class="hljs-attr">icon</span>: <span class="hljs-string">'flight'</span>}, |
| 65 | + ]; |
63 | 66 |
|
64 | | - <span class="hljs-keyword">const</span> comboboxRect = combobox.<span class="hljs-title function_">inputElement</span>()?.<span class="hljs-title function_">getBoundingClientRect</span>(); |
65 | | - <span class="hljs-keyword">const</span> popoverEl = popover.<span class="hljs-property">nativeElement</span>; |
| 67 | + <span class="hljs-title function_">constructor</span>(<span class="hljs-params"></span>) { |
| 68 | + <span class="hljs-comment">// Updates the display value when the listbox values change.</span> |
| 69 | + <span class="hljs-title function_">afterRenderEffect</span>(<span class="hljs-function">() =></span> { |
| 70 | + <span class="hljs-keyword">const</span> values = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">listbox</span>()?.<span class="hljs-title function_">values</span>() || []; |
| 71 | + <span class="hljs-keyword">if</span> (values.<span class="hljs-property">length</span> === <span class="hljs-number">0</span>) { |
| 72 | + <span class="hljs-variable language_">this</span>.<span class="hljs-property">displayValue</span>.<span class="hljs-title function_">set</span>(<span class="hljs-string">'Select a label'</span>); |
| 73 | + } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (values.<span class="hljs-property">length</span> === <span class="hljs-number">1</span>) { |
| 74 | + <span class="hljs-variable language_">this</span>.<span class="hljs-property">displayValue</span>.<span class="hljs-title function_">set</span>(values[<span class="hljs-number">0</span>]); |
| 75 | + } <span class="hljs-keyword">else</span> { |
| 76 | + <span class="hljs-variable language_">this</span>.<span class="hljs-property">displayValue</span>.<span class="hljs-title function_">set</span>(<span class="hljs-string">`<span class="hljs-subst">${values[<span class="hljs-number">0</span>]}</span> + <span class="hljs-subst">${values.length - <span class="hljs-number">1</span>}</span> more`</span>); |
| 77 | + } |
| 78 | + }); |
66 | 79 |
|
67 | | - <span class="hljs-keyword">if</span> (comboboxRect) { |
68 | | - popoverEl.<span class="hljs-property">style</span>.<span class="hljs-property">width</span> = <span class="hljs-string">`<span class="hljs-subst">${comboboxRect.width}</span>px`</span>; |
69 | | - popoverEl.<span class="hljs-property">style</span>.<span class="hljs-property">top</span> = <span class="hljs-string">`<span class="hljs-subst">${comboboxRect.bottom + <span class="hljs-number">4</span>}</span>px`</span>; |
70 | | - popoverEl.<span class="hljs-property">style</span>.<span class="hljs-property">left</span> = <span class="hljs-string">`<span class="hljs-subst">${comboboxRect.left - <span class="hljs-number">1</span>}</span>px`</span>; |
71 | | - } |
| 80 | + <span class="hljs-comment">// Scrolls to the active item when the active option changes.</span> |
| 81 | + <span class="hljs-comment">// The slight delay here is to ensure animations are done before scrolling.</span> |
| 82 | + <span class="hljs-title function_">afterRenderEffect</span>(<span class="hljs-function">() =></span> { |
| 83 | + <span class="hljs-keyword">const</span> option = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">options</span>().<span class="hljs-title function_">find</span>(<span class="hljs-function"><span class="hljs-params">opt</span> =></span> opt.<span class="hljs-title function_">active</span>()); |
| 84 | + <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> option?.<span class="hljs-property">element</span>.<span class="hljs-title function_">scrollIntoView</span>({<span class="hljs-attr">block</span>: <span class="hljs-string">'nearest'</span>}), <span class="hljs-number">50</span>); |
| 85 | + }); |
72 | 86 |
|
73 | | - popover.<span class="hljs-property">nativeElement</span>.<span class="hljs-title function_">showPopover</span>(); |
| 87 | + <span class="hljs-comment">// Resets the listbox scroll position when the combobox is closed.</span> |
| 88 | + <span class="hljs-title function_">afterRenderEffect</span>(<span class="hljs-function">() =></span> { |
| 89 | + <span class="hljs-keyword">if</span> (!<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">combobox</span>()?.<span class="hljs-title function_">expanded</span>()) { |
| 90 | + <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">listbox</span>()?.<span class="hljs-property">element</span>.<span class="hljs-title function_">scrollTo</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>), <span class="hljs-number">150</span>); |
| 91 | + } |
| 92 | + }); |
74 | 93 | } |
75 | 94 | } |
76 | | - |
77 | | -<span class="hljs-keyword">const</span> states = [<span class="hljs-string">'Option 1'</span>, <span class="hljs-string">'Option 2'</span>, <span class="hljs-string">'Option 3'</span>]; |
|
0 commit comments