Barista: 콀보 μƒμž: μƒˆ ꡬ성 μš”μ†Œ

에 λ§Œλ“  2020λ…„ 03μ›” 02일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: dynatrace-oss/barista

κΈ°λŠ₯ μš”μ²­

μš”μ•½

λΌμ΄λΈŒλŸ¬λ¦¬μ— 콀보 μƒμž ꡬ성 μš”μ†Œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

κΈ°λŠ₯ μ„€λͺ…

μš°λ¦¬λŠ” λ§Žμ€ 데이터λ₯Ό 닀루고 μžˆμŠ΅λ‹ˆλ‹€. 우리의 dt-selectλŠ” μ‹€μ œλ‘œ λ§Žμ€ μ˜΅μ…˜ μ„ΈνŠΈμ™€ ν•¨κ»˜ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. dt-select의 검색 κΈ°λŠ₯은 κΈ°λ³Έ 선택과 λ™μΌν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ‚¬μš©μžλŠ” μ‚¬μš©μžκ°€ λˆ„λ₯Έ ν‚€μ—μ„œ μ‹œμž‘ν•˜λŠ” μ˜΅μ…˜μœΌλ‘œλ§Œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λŠ” λŒ€κ·œλͺ¨ 데이터 μ„ΈνŠΈκ°€ μžˆλŠ” μ‚¬μš© μ‚¬λ‘€μ—μ„œ μ‹€μ œλ‘œ μ œν•œμ μž…λ‹ˆλ‹€.
dt-autocompleteκ°€ μ—°κ²°λœ μž…λ ₯μ—μ„œ ꡬ성할 수 μžˆλŠ” 콀보 μƒμž ꡬ성 μš”μ†Œκ°€ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μž…λ ₯은 자리 ν‘œμ‹œμž ν…μŠ€νŠΈλ₯Ό ν‘œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.
Combobox

콀보 μƒμžλŠ” dt-select와 λ™μΌν•œ μŠ€νƒ€μΌμ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

행동

λ“œλ‘­λ‹€μš΄μ„ ν΄λ¦­ν•˜λ©΄ μ‚¬μš©μžκ°€ 선택할 수 μžˆλŠ” μ—¬λŸ¬ ν•­λͺ© λͺ©λ‘μ΄ 열리고 μ»€μ„œκ°€ μž…λ ₯ ν•„λ“œμ— λ†“μž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μž…λ ₯을 μ‹œμž‘ν•˜μžλ§ˆμž 콀보 μƒμžλŠ” λ””λ°”μš΄μŠ€λœ 이벀트λ₯Ό 내보내고 ν•„ν„° ν•„λ“œμ— 이미 μžˆλŠ” 것과 μœ μ‚¬ν•œ μž…λ ₯ 내뢀에 λ‘œλ”© ν‘œμ‹œκΈ°λ₯Ό ν‘œμ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν•­λͺ©μ΄ μ„ νƒλ˜λ©΄ λ“œλ‘­λ‹€μš΄μ΄ λ‹«νžˆκ³  그에 따라 μž…λ ₯ ν•„λ“œκ°€ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

Combobox on click

콀보 μƒμžμ˜ 첫 번째 λ²„μ „μ˜ 경우 가상 μŠ€ν¬λ‘€μ— λŒ€ν•΄ κ±±μ •ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ„œλ²„ μΈ‘μ—μ„œ ν•­λͺ© 필터링이 μˆ˜ν–‰λ  κ²ƒμœΌλ‘œ μ˜ˆμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ— μ±„μ›Œμ§„ ν•­λͺ©μ„ λ Œλ”λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ²„μ „μ—μ„œ λŒ€κ·œλͺ¨ 데이터 μ„ΈνŠΈμ˜ 처리λ₯Ό κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
첫 번째 λ²„μ „μ˜ 경우 dt-autocompleteλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μ§€λ§Œ 데이터 λͺ©λ‘μœΌλ‘œ λ‹¨μˆœν™”λœ λ“œλ‘­λ‹€μš΄μ„ λ§Œλ“œλŠ” 것을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • [ ] API μ œμ•ˆμ„œ μž‘μ„±
  • [ ] 라이브러리 및 데λͺ¨ λ§Œλ“€κΈ°
  • [ ] λ“œλ‘­λ‹€μš΄μ„ μΆ”κ°€ν•˜κ³  dtInput 내뢀에 μΊλŸΏμ„ ν¬ν•¨ν•˜λŠ” μΆ”κ°€ μŠ€νƒ€μΌμ„ λ§Œλ“­λ‹ˆλ‹€.
  • [ ] λ””λ°”μš΄μŠ€λœ μž…λ ₯ 이벀트 + λ‘œλ”© ν‘œμ‹œκΈ° μΆ”κ°€
  • [ ] λ‹¨μœ„ ν…ŒμŠ€νŠΈ μΆ”κ°€
  • [ ] e2e ν…ŒμŠ€νŠΈ μΆ”κ°€

첨뢀 파일

P2 feature help wanted new component

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

두 가지 μž…λ ₯을 더 μΆ”κ°€ν•  것을 μ œμ•ˆν•©λ‹ˆλ‹€.
| 이름 | μœ ν˜• | κΈ°λ³Έκ°’ | μ„€λͺ… |
| --- | --- | --- | --- |
| λ‘œλ”© | boolean | false | true둜 μ„€μ •ν•˜λ©΄ 데이터가 ν˜„μž¬ λ‘œλ“œ/ν•„ν„°λ§λ˜κ³  μžˆμŒμ„ μ‚¬μš©μžμ—κ²Œ 보여주기 μœ„ν•΄ λ‘œλ“œ ν‘œμ‹œκΈ°κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. |
| λ””μŠ€ν”Œλ ˆμ΄ | (value: T) => string | (value: T) => ${κ°’}`` | 콀보 μƒμžμ—μ„œ μ˜΅μ…˜μ„ λ‚˜νƒ€λ‚΄λŠ” μ§€μ •λœ 개체의 ν‘œμ‹œ 이름을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ |

displayWith ν•¨μˆ˜λŠ” κ°œμ²΄μ™€ ν•¨κ»˜ 콀보 μƒμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 관련이 있으며 λ‘œλ“œ ν‘œμ‹œκΈ°λŠ” λŒ€λΆ€λΆ„μ˜ 경우 필터링을 μ„œλ²„ 츑으둜 μ˜€ν”„λ‘œλ“œν•˜λŠ” ꡬ성 μš”μ†Œμ— λŒ€ν•΄ λ³΄μ¦λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  8 λŒ“κΈ€

μ ‘κ·Όμ„± μ°Έμ‘° 둜 λͺ©λ‘ μƒμž νŒμ—…μ΄ μžˆλŠ” WAI-ARIA 콀보 μƒμž 의 λͺ¨λ²” 사둀 ꢌμž₯ 사항을 κ³ λ €ν•˜μ‹­μ‹œμ˜€.

API μ œμ•ˆ μ½€λ³΄λ°•μŠ€

κ³ κΈ‰ ꡬ쑰

<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
   <dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>

μž…λ ₯

| 이름 | μœ ν˜• | μ„€λͺ… |
| -------------- | -------------- | -------------- |
| value | string \| undefined | μž…λ ₯의 μ΄ˆκΈ°κ°’ |
| placeholder | string \| undefined | μž…λ ₯에 λŒ€ν•œ 자리 ν‘œμ‹œμž |

좜λ ₯

| 이름 | μœ ν˜• | μ„€λͺ… |
| -------------- | -------------- | -------------- |
| valueChanges | EventEmitter<string> | μƒˆ 값이 μ„ νƒλ˜μ—ˆμ„ λ•Œ λ°œμƒν•˜λŠ” 이벀트 |
| filterChanges | EventEmitter<string> | ν•„ν„°κ°€ 변경될 λ•Œ λ°œμƒν•˜λŠ” 이벀트 |

μ½˜ν…μΈ  ν”„λ‘œμ μ…˜
dt-μ˜΅μ…˜
dt-optgroup

체크리슀트

  • [ ] μ μ ˆν•œ ν‚€λ³΄λ“œ 지원(ν™”μ‚΄ν‘œ: μœ„ μ•„λž˜)
  • [ ] 와이아리아
  • [ ] ngForms ν˜Έν™˜μ„± κ³ λ €
  • [ ] 검증 κ³ λ €

@lukett89λ‹˜ , API μ œμ•ˆ κ°μ‚¬ν•©λ‹ˆλ‹€. 정말 ν›Œλ₯­ν•œ μΆœλ°œμ μž…λ‹ˆλ‹€.
dt-select μ—μ„œμ™€ λ™μΌν•œ μž…λ ₯이 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚˜λŠ” μΆ”κ°€ν•  것이닀
| 이름 | μœ ν˜• | μ„€λͺ… |
| -------------- | -------------- | -------------- |
| id | string | 선택 ID |
| compareWith | (v1: T, v2: T) => boolean | μ˜΅μ…˜ κ°’κ³Ό μ„ νƒν•œ 값을 λΉ„κ΅ν•˜λŠ” κΈ°λŠ₯ |
| required | boolean | μž…λ ₯이 ν•„μš”ν•œμ§€ μ—¬λΆ€ |
| panelClass | string | 콀보 μƒμž λ“œλ‘­λ‹€μš΄μ— μΆ”κ°€λœ 클래슀 |

"opened"와 같은 μ—΄λ¦° μƒνƒœμ— λŒ€ν•œ getter 및 ν•΄λ‹Ή μƒνƒœκ°€ 변경될 λ•Œ 좜λ ₯을 μΆ”κ°€ν•˜λŠ” 것도 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.
선택에 κ°€μž₯ κ°€κΉŒμš΄ APIλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λŠ₯ν•œ ν•œ μ‰½κ²Œ λ‘˜ 쀑 ν•˜λ‚˜λ₯Ό μ „ν™˜ν•  수 μžˆλ‹€λ©΄ 도움이 될 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

@ffriedl89 λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€.
ꡬ성 μš”μ†Œμ˜ 첫 번째 버전에 λŒ€ν•΄ μ–ΈκΈ‰ν•œ λͺ¨λ“  μž…λ ₯/좜λ ₯을 κ³ λ €ν•  κ²ƒμž…λ‹ˆλ‹€.

μ΅œμ’… API μ œμ•ˆ μ½€λ³΄λ°•μŠ€

κ³ κΈ‰ ꡬ쑰

<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
   <dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>

μž…λ ₯

| 이름 | μœ ν˜• | μ„€λͺ… |
| -------------- | -------------- | -------------- |
| value | string \| undefined | μž…λ ₯의 μ΄ˆκΈ°κ°’ |
| placeholder | string \| undefined | μž…λ ₯에 λŒ€ν•œ 자리 ν‘œμ‹œμž |
| id | λ¬Έμžμ—΄ | 선택 ID |
| compareWith | (v1: T, v2: T) => boolean | μ˜΅μ…˜ κ°’κ³Ό μ„ νƒν•œ 값을 λΉ„κ΅ν•˜λŠ” κΈ°λŠ₯ |
| required | boolean | μž…λ ₯이 ν•„μš”ν•œμ§€ μ—¬λΆ€ |
| panelClass | string | 콀보 μƒμž λ“œλ‘­λ‹€μš΄μ— μΆ”κ°€λœ 클래슀 |

좜λ ₯

| 이름 | μœ ν˜• | μ„€λͺ… |
| -------------- | -------------- | -------------- |
| valueChanges | EventEmitter<string> | μƒˆ 값이 μ„ νƒλ˜μ—ˆμ„ λ•Œ λ°œμƒν•˜λŠ” 이벀트 |
| filterChanges | EventEmitter<string> | ν•„ν„°κ°€ 변경될 λ•Œ λ°œμƒν•˜λŠ” 이벀트 |
| openedChange | 이벀트 이미터| 선택 νŒ¨λ„μ΄ ν† κΈ€λ˜μ—ˆμ„ λ•Œ λ°œμƒν•˜λŠ” μ΄λ²€νŠΈμž…λ‹ˆλ‹€. |

μ½˜ν…μΈ  ν”„λ‘œμ μ…˜
dt-μ˜΅μ…˜
dt-optgroup

체크리슀트

  • [ ] μ μ ˆν•œ ν‚€λ³΄λ“œ 지원(ν™”μ‚΄ν‘œ: μœ„ μ•„λž˜)
  • [ ] 와이아리아
  • [ ] ngForms ν˜Έν™˜μ„± κ³ λ €
  • [ ] 검증 κ³ λ €

μ•žμœΌλ‘œ 2μ£Ό 이내에 이 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μ €μ—κ²Œ 문제λ₯Ό ν• λ‹Ήν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@heartdisease 및 @lukett89 와 λ™κΈ°ν™”ν•˜μ—¬ λ…Όμ˜ν•œ ν›„ 문제λ₯Ό λ‹€μ‹œ ν• λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.

두 가지 μž…λ ₯을 더 μΆ”κ°€ν•  것을 μ œμ•ˆν•©λ‹ˆλ‹€.
| 이름 | μœ ν˜• | κΈ°λ³Έκ°’ | μ„€λͺ… |
| --- | --- | --- | --- |
| λ‘œλ”© | boolean | false | true둜 μ„€μ •ν•˜λ©΄ 데이터가 ν˜„μž¬ λ‘œλ“œ/ν•„ν„°λ§λ˜κ³  μžˆμŒμ„ μ‚¬μš©μžμ—κ²Œ 보여주기 μœ„ν•΄ λ‘œλ“œ ν‘œμ‹œκΈ°κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. |
| λ””μŠ€ν”Œλ ˆμ΄ | (value: T) => string | (value: T) => ${κ°’}`` | 콀보 μƒμžμ—μ„œ μ˜΅μ…˜μ„ λ‚˜νƒ€λ‚΄λŠ” μ§€μ •λœ 개체의 ν‘œμ‹œ 이름을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ |

displayWith ν•¨μˆ˜λŠ” κ°œμ²΄μ™€ ν•¨κ»˜ 콀보 μƒμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 관련이 있으며 λ‘œλ“œ ν‘œμ‹œκΈ°λŠ” λŒ€λΆ€λΆ„μ˜ 경우 필터링을 μ„œλ²„ 츑으둜 μ˜€ν”„λ‘œλ“œν•˜λŠ” ꡬ성 μš”μ†Œμ— λŒ€ν•΄ λ³΄μ¦λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰