Barista: 연ꡬ: Combobox / μ›Ή ꡬ성 μš”μ†Œλ‘œ 선택

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

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

μš”μ•½

μ›Ή ꡬ성 μš”μ†Œ μ„Έκ³„μ—μ„œμ²˜λŸΌ 보이도둝 선택/μ½€λ³΄λ°•μŠ€μ— λŒ€ν•œ APIλ₯Ό κ΅¬μƒν•˜λŠ” 방법을 연ꡬ해야 ν•©λ‹ˆλ‹€.

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

선택 μƒμž λ˜λŠ” 콀보 μƒμžλŠ” 잠재적으둜 λ™μΌν•œ ꡬ성 μš”μ†ŒμΌ 수 μžˆμ§€λ§Œ λΆ„λ¦¬ν•˜κ³  싢을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이것은 아직 많이 λ―Έμ •μž…λ‹ˆλ‹€.

콀보 μƒμž/선택 ꡬ성 μš”μ†Œμ— λŒ€ν•œ λ‹€μ–‘ν•œ ꡬ성 μš”μ†Œ 라이브러리/섀계 μ‹œμŠ€ν…œ μ ‘κ·Ό 방식을 λΉ„κ΅ν•˜κ³  μž‘λ™ν•  API μ œμ•ˆμ„ 생각해 λ³΄μ„Έμš”.

일뢀 잠재적 λ¦¬μ†ŒμŠ€:

μ˜΅μ…˜μ˜ κ°€μƒν™”λŠ” ν•„μˆ˜ 사항이 될 κ²ƒμž„μ„ λͺ…μ‹¬ν•˜μ‹­μ‹œμ˜€. 이것은 μ›Ή ꡬ성 μš”μ†Œ κ³„μΈ΅μ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” κ²ƒμž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ μ†ŒλΉ„μžκ°€ 잠재적인 ν”„λ ˆμž„μ›Œν¬ κ³„μΈ΅μ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” κ²ƒμž…λ‹ˆκΉŒ?
μ˜΅μ…˜μ— λŒ€ν•œ 가상 μŠ€ν¬λ‘€μ„ μ‚¬μš©ν•˜μ—¬ Angular μ„€μ •μ—μ„œ μœ„μ˜ μ›Ή ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈν•˜κ³  μ‘°μ‚¬ν•©λ‹ˆλ‹€.
μ›Ή ꡬ성 μš”μ†Œμ—μ„œλ„ λ°˜μ‘ 및 가상화λ₯Ό μ‚¬μš©ν•΄ λ³΄μ‹­μ‹œμ˜€.

μš°λ¦¬κ°€ 이것을 슀슀둜 μ²˜λ¦¬ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€λ©΄ - 일단 μƒμ„±λœ μ˜΅μ…˜μ— λŒ€ν•œ μ»¨ν…μŠ€νŠΈλ₯Ό μ„€μ •ν•˜λŠ” ν…œν”Œλ¦Ώ λ©”μ»€λ‹ˆμ¦˜μ„ κ΅¬μΆ•ν•˜λŠ” 것이 μš°λ¦¬κ°€ ν•΄μ•Ό ν•  μΌμž…λ‹ˆλ‹€.

이와 같은 것을 λ‹¬μ„±ν•˜λŠ” 방법에 λŒ€ν•œ 일뢀 λ¦¬μ†ŒμŠ€λŠ” microsoft-graph-toolkit일 수 μžˆμŠ΅λ‹ˆλ‹€.

이 문제의 κ²°κ³ΌλŠ” μš°λ¦¬κ°€ μ•žμœΌλ‘œ λ‚˜μ•„κ°ˆ 방법에 λŒ€ν•΄ 정보에 μž…κ°ν•œ 결정을 내릴 수 μžˆλ„λ‘ 우리의 μ˜΅μ…˜κ³Ό 찬반 양둠에 λŒ€ν•œ κ°œμš”μ—¬μ•Ό ν•©λ‹ˆλ‹€.

Basic select mock

feature has-pr next

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

μš”κ΅¬ 사항

  • 가상 슀크둀: μ„±λŠ₯ 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ μ˜΅μ…˜μ˜ μΌλΆ€λ§Œ μ‹€μ œλ‘œ λ Œλ”λ§λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μž 지정 ν…œν”Œλ¦Ώ: μ‚¬μš©μžλŠ” μ˜΅μ…˜μ„ λ Œλ”λ§ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 필터링: ν•­λͺ© λͺ©λ‘μ„ ν•„ν„°λ§ν•˜λ €λ©΄ μ‚¬μš©μžκ°€ μž…λ ₯을 μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 필터링은 μ‚¬μš©μžκ°€ μ œκ³΅ν•˜λŠ” ν•„ν„° κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ λ°œμƒν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 슀크둀 ν‘œμ‹œκΈ°: 더 λ§Žμ€ μ˜΅μ…˜μ΄ μžˆλŠ”μ§€ μ—¬λΆ€λŠ” 항상 λͺ…ν™•ν•΄μ•Ό ν•©λ‹ˆλ‹€

λ‹€μŒ 단계 μš”κ΅¬ 사항

  • λ‘œλ”© μƒνƒœ: μ‚¬μš©ν•  수 μžˆλŠ” ν•­λͺ©μ΄ μ—†λŠ” ν•œ λ‘œλ”© μŠ€ν”Όλ„ˆκ°€ μ˜€λ²„λ ˆμ΄μ— ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ToDo λ‘œλ”© μŠ€ν”Όλ„ˆλŠ” 어디에 ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆκΉŒ?
  • 닀쀑 선택: μ‚¬μš©μžκ°€ μ—¬λŸ¬ μ˜΅μ…˜μ„ 선택할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ˜΅μ…˜ κ·Έλ£Ή: μ˜΅μ…˜μ„ κ·Έλ£Ήν™” ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ ‘κ·Όμ„±

초점이 λ§žμΆ°μ§€λ©΄ Enter , ArrowUp λ˜λŠ” ArrowDown ν‚€λ₯Ό λˆ„λ₯΄κ±°λ‚˜ μ‚¬μš©μžκ°€ μž…λ ₯ ν•„λ“œμ— ν•„ν„°λ₯Ό μž…λ ₯ν•˜κΈ° μ‹œμž‘ν•  λ•Œ 콀보 μƒμžκ°€ μ—΄λ¦½λ‹ˆλ‹€.

열리면 μ‚¬μš©μžλŠ” ArrowUp / ArrowDown ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°μ‘΄ μ˜΅μ…˜μ—μ„œ 선택할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. ν•„ν„° μž…λ ₯에 λŒ€ν•œ μ΄ˆμ μ€ μž…λ ₯ ν•„λ“œμ— 남아 μžˆμ–΄μ•Ό ν•˜λ©° μ˜΅μ…˜μ€ νƒ­ν•  수 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ˜΅μ…˜μ˜ 선택 μƒνƒœλŠ” aria-selected 속성을 μ‚¬μš©ν•˜μ—¬ ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

Enter ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ 선택 ν•­λͺ©μ„ μ œμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

Tab λ˜λŠ” Escape ν‚€λ₯Ό λˆ„λ₯΄λ©΄ μ˜€λ²„λ ˆμ΄κ°€ λ‹«νžˆκ³  μ„ νƒν•œ ν•­λͺ©μ΄ λ³€κ²½λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

ν•„ν„°λ₯Ό μž…λ ₯ν•œ λ‹€μŒ μž…λ ₯ ν•„λ“œ λ°–μœΌλ‘œ 탭을 μ΄λ™ν•˜λ©΄ ν•„ν„°κ°€ μž¬μ„€μ •λ˜κ³  이전에 μ„ νƒν•œ ν•­λͺ©μ΄ ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ‚¬μš©μž μ •μ˜ ν…œν”Œλ¦Ώ ꡬ문

μ‚¬μš©μžλŠ” ν…œν”Œλ¦Ώ λΆ€λΆ„μ˜ μ—¬λŠ” λ¬Έμžμ—΄κ³Ό λ‹«λŠ” λ¬Έμžμ—΄μ„ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” μ „μ—­ λ˜λŠ” ꡬ성 μš”μ†Œλ³„ μˆ˜μ€€μ—μ„œ κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€(아직 κ²°μ •λ˜μ§€ μ•ŠμŒ).

기본값은 {{ 및 }} μž…λ‹ˆλ‹€.

API μ œμ•ˆ

_WIP_

ComboBoxλŠ” κΈ°λ³Έ FluidComboBox ꡬ성 μš”μ†Œ, FluidComboBoxOptionsList ꡬ성 μš”μ†Œ 및 FluidComboBoxOption ꡬ성 μš”μ†Œλ‘œ λΆ„ν• λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

FluidComboBox

FluidComboBoxOptionsList λ₯Ό ν¬ν•¨ν•˜λ©°, μ—¬κΈ°μ—λŠ” μ°¨λ‘€λ‘œ FluidComboBoxOption κ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
μ˜€λ²„λ ˆμ΄ μ—΄κΈ° 및 λ‹«κΈ° 및 μ˜€λ²„λ ˆμ΄ μœ„μΉ˜ 지정을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
κΈ°λ³Έ HTMLElement sλ₯Ό ν—ˆμš©ν•˜λŠ” ν•˜μœ„ μš”μ†Œλ‘œ ν…œν”Œλ¦Ώμ„ ν—ˆμš©ν•©λ‹ˆλ‹€.

ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•  λ•Œ ν…œν”Œλ¦Ώ 바인딩에 μ‚¬μš©λ˜λŠ” μ—¬λŠ” λ¬Έμžμ—΄κ³Ό λ‹«λŠ” λ¬Έμžμ—΄μ„ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μž…λ ₯

| 이름 | μ˜ˆμ • | μœ ν˜• | κΈ°λ³Έκ°’ | μ„€λͺ… |
| -------------- | ----------- | -------- | ------- | -------------------------------------------------- ------------------------------ |
| μ˜΅μ…˜ | MVP | λ°°μ—΄ | [] | FluidComboBoxOptionsList 에 ν‘œμ‹œν•  μ˜΅μ…˜ λ°°μ—΄ |
| ν•„ν„°Fn | MVP | (option: T) => boolean | null | 필터링 μ˜΅μ…˜μ— μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ |
| λ Œλ”μ˜΅μ…˜Fn | MVP | (option: T) => string | null | μžλ™ μ™„μ„± νŒ¨λ„μ—μ„œ μ˜΅μ…˜μ„ λ Œλ”λ§ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ |
| 자리 ν‘œμ‹œμž | MVP | λ¬Έμžμ—΄ | '' | μ˜΅μ…˜μ΄ μ„ νƒλ˜μ§€ μ•Šμ€ 경우 μž…λ ₯ ν•„λ“œμ— ν‘œμ‹œν•  자리 ν‘œμ‹œμž |
| μž₯애인 | MVP | λΆ€μšΈ | 거짓 | 콀보 μƒμžκ°€ λΉ„ν™œμ„±ν™”λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” λΆ€μšΈ |
| λ‘œλ”© | MVP | λΆ€μšΈ | 거짓 | λ‘œλ”© ν‘œμ‹œκΈ°λ₯Ό ν‘œμ‹œν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” λΆ€μšΈ |
| 선택 | MVP | μ–΄λ–€ | 널 | 사전 선택 ν•­λͺ© |
| 닀쀑 선택 | v2 | λΆ€μšΈ | 거짓 | λ‘˜ μ΄μƒμ˜ μ˜΅μ…˜μ„ λ™μ‹œμ— 선택할 수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” λΆ€μšΈ |

좜λ ₯

| 이름 | μ˜ˆμ • | μœ ν˜• | μ„€λͺ… |
| ---------------- | ----------- | ---------------------------------- | -------------------------------------------------- ---- |
| λ³€κ²½ | MVP | FluidComboBoxChangeEvent | 값이 변경될 λ•Œ λ°œμƒν•˜λŠ” 이벀트 |
| ν•„ν„° κ΅ν™˜ | MVP | FluidComboBoxFilterChangeEvent | μ‚¬μš©μžκ°€ 필터링 값을 μž…λ ₯ν•˜λ©΄ λ°œμƒν•˜λŠ” 이벀트 |
| 선택 λ³€κ²½ | MVP | FluidComboBoxSelectionChangeEvent | μ„ νƒν•œ μ˜΅μ…˜μ΄ 변경될 λ•Œ λ°œμƒν•˜λŠ” 이벀트 |

FluidLoadingSpinner

FluidComboBox의 μ „μ œ 쑰건으둜 μž¬μ‚¬μš© κ°€λŠ₯ν•œ λ‘œλ”© μŠ€ν”Όλ„ˆ ꡬ성 μš”μ†Œλ₯Ό λ¨Όμ € κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
ToDo μƒˆλ‘œμš΄ λ‘œλ”© μŠ€ν”Όλ„ˆμ˜ L&F에 λŒ€ν•΄ UX에 λ¬Έμ˜ν•˜μ‹­μ‹œμ˜€(λ˜λŠ” 이전 λ””μžμΈμ„ μž¬μ‚¬μš©ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€).

FluidVirtualScroller

FluidComboBox의 μ „μ œ 쑰건으둜 가상 μŠ€ν¬λ‘€μ„ κ΅¬ν˜„ν•˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λ‹€μˆ˜μ˜ μ•„μ΄ν…œμ΄ μžˆλŠ” μ½€λ³΄λ°•μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

λ˜ν•œλ³΄μ‹­μ‹œμ˜€:
https://github.com/WICG/virtual-scroller/blob/master/README.md
https://www.sitepen.com/blog/next-generation-virtual-scrolling/
https://dev.to/adamklein/build-your-own-virtual-scroll-part-i-11ib
https://blog.logrocket.com/virtual-scrolling-core-principles-and-basic-implementation-in-react/

ν”Œλ£¨μ΄λ“œνŒμ˜€λ²„

FluidComboBox의 μ „μ œ 쑰건으둜 λ°°μΉ˜ν•  수 μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ νŒμ˜€λ²„ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
콀보 μƒμžμ˜ μž…λ ₯ μš”μ†Œ μ•„λž˜μ— μ™„λ²½ν•˜κ²Œ μžˆμŠ΅λ‹ˆλ‹€.

이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν•΄λ‹Ή ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
https://popper.js.org/docs/v2/

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

콀보 μƒμžμ— λŒ€ν•œ API 아이디어에 λŒ€ν•΄ @heartdisease 와 λ™κΈ°ν™”ν•˜μ‹­μ‹œμ˜€. κ·ΈλŠ” Angular에 λŒ€ν•œ ν˜„μž¬ μ‹€ν—˜ 버전을 κ°œμ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μŠ¬λ‘―μ— 제곡된 주어진 μ»¨ν…μŠ€νŠΈμ™€ ν…œν”Œλ¦Ώ 을 μ‚¬μš©ν•˜μ—¬ 콀보 μƒμž ν•­λͺ©μ„ μƒμ„±ν•˜κΈ° μœ„ν•΄
이 리포지토리에 ν…ŒμŠ€νŠΈλ₯Ό μ—…λ‘œλ“œν–ˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ ν•­λͺ© λͺ©λ‘μ„ μ „λ‹¬ν•˜κ³  (선택 사항) ν…œν”Œλ¦Ώμ„ 콀보 μƒμžμ— μ „λ‹¬ν•˜κ³  슀크둀 μœ„μΉ˜μ™€ 높이에 따라 x개 ν•­λͺ©λ§Œ λ Œλ”λ§ν•˜λ„λ‘ ν•­λͺ©μ„ μ‹€μ œλ‘œ λ Œλ”λ§ν•˜κΈ° 전에 가상화λ₯Ό "κ·Έλƒ₯" μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ˜€λ²„λ ˆμ΄ μ»¨ν…Œμ΄λ„ˆ.

ν˜„μž¬ TemplateHelper.renderTemplate() λ©”μ„œλ“œλŠ” HTMLElementλ₯Ό 루트 λ…Έλ“œ, ν…œν”Œλ¦Ώ 및 μ»¨ν…μŠ€νŠΈ(및 선택적 μΆ”κ°€ μ»¨ν…μŠ€νŠΈ)둜 ν—ˆμš©ν•©λ‹ˆλ‹€. 주어진 ν…œν”Œλ¦Ώμ— 따라 λͺ¨λ“  λ…Έλ“œλ₯Ό μƒμ„±ν•˜κ³  루트 λ…Έλ“œμ— μ—°κ²°ν•©λ‹ˆλ‹€.
이 λ™μž‘μ„ λ³€κ²½ν•˜κ³  λ©”μ„œλ“œκ°€ ν…œν”Œλ¦Ώκ³Ό μ»¨ν…μŠ€νŠΈλ§Œ μˆ˜λ½ν•˜κ³  컴파일된 ν…œν”Œλ¦Ώμ„ λ°˜ν™˜ν•˜λ„λ‘ ν•œ λ‹€μŒ λ°˜ν™˜λœ HTML을 ꡬ성 μš”μ†Œμ˜ μ‘°λͺ… ν…œν”Œλ¦Ώμ—μ„œ 직접 좜λ ₯ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이 더 λ‚˜μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ–΄λ–»κ²Œ 생각해?

μš”κ΅¬ 사항

  • 가상 슀크둀: μ„±λŠ₯ 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ μ˜΅μ…˜μ˜ μΌλΆ€λ§Œ μ‹€μ œλ‘œ λ Œλ”λ§λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μž 지정 ν…œν”Œλ¦Ώ: μ‚¬μš©μžλŠ” μ˜΅μ…˜μ„ λ Œλ”λ§ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 필터링: ν•­λͺ© λͺ©λ‘μ„ ν•„ν„°λ§ν•˜λ €λ©΄ μ‚¬μš©μžκ°€ μž…λ ₯을 μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 필터링은 μ‚¬μš©μžκ°€ μ œκ³΅ν•˜λŠ” ν•„ν„° κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ λ°œμƒν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 슀크둀 ν‘œμ‹œκΈ°: 더 λ§Žμ€ μ˜΅μ…˜μ΄ μžˆλŠ”μ§€ μ—¬λΆ€λŠ” 항상 λͺ…ν™•ν•΄μ•Ό ν•©λ‹ˆλ‹€

λ‹€μŒ 단계 μš”κ΅¬ 사항

  • λ‘œλ”© μƒνƒœ: μ‚¬μš©ν•  수 μžˆλŠ” ν•­λͺ©μ΄ μ—†λŠ” ν•œ λ‘œλ”© μŠ€ν”Όλ„ˆκ°€ μ˜€λ²„λ ˆμ΄μ— ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ToDo λ‘œλ”© μŠ€ν”Όλ„ˆλŠ” 어디에 ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆκΉŒ?
  • 닀쀑 선택: μ‚¬μš©μžκ°€ μ—¬λŸ¬ μ˜΅μ…˜μ„ 선택할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ˜΅μ…˜ κ·Έλ£Ή: μ˜΅μ…˜μ„ κ·Έλ£Ήν™” ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ ‘κ·Όμ„±

초점이 λ§žμΆ°μ§€λ©΄ Enter , ArrowUp λ˜λŠ” ArrowDown ν‚€λ₯Ό λˆ„λ₯΄κ±°λ‚˜ μ‚¬μš©μžκ°€ μž…λ ₯ ν•„λ“œμ— ν•„ν„°λ₯Ό μž…λ ₯ν•˜κΈ° μ‹œμž‘ν•  λ•Œ 콀보 μƒμžκ°€ μ—΄λ¦½λ‹ˆλ‹€.

열리면 μ‚¬μš©μžλŠ” ArrowUp / ArrowDown ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ κΈ°μ‘΄ μ˜΅μ…˜μ—μ„œ 선택할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. ν•„ν„° μž…λ ₯에 λŒ€ν•œ μ΄ˆμ μ€ μž…λ ₯ ν•„λ“œμ— 남아 μžˆμ–΄μ•Ό ν•˜λ©° μ˜΅μ…˜μ€ νƒ­ν•  수 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ˜΅μ…˜μ˜ 선택 μƒνƒœλŠ” aria-selected 속성을 μ‚¬μš©ν•˜μ—¬ ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

Enter ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ 선택 ν•­λͺ©μ„ μ œμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

Tab λ˜λŠ” Escape ν‚€λ₯Ό λˆ„λ₯΄λ©΄ μ˜€λ²„λ ˆμ΄κ°€ λ‹«νžˆκ³  μ„ νƒν•œ ν•­λͺ©μ΄ λ³€κ²½λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

ν•„ν„°λ₯Ό μž…λ ₯ν•œ λ‹€μŒ μž…λ ₯ ν•„λ“œ λ°–μœΌλ‘œ 탭을 μ΄λ™ν•˜λ©΄ ν•„ν„°κ°€ μž¬μ„€μ •λ˜κ³  이전에 μ„ νƒν•œ ν•­λͺ©μ΄ ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ‚¬μš©μž μ •μ˜ ν…œν”Œλ¦Ώ ꡬ문

μ‚¬μš©μžλŠ” ν…œν”Œλ¦Ώ λΆ€λΆ„μ˜ μ—¬λŠ” λ¬Έμžμ—΄κ³Ό λ‹«λŠ” λ¬Έμžμ—΄μ„ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” μ „μ—­ λ˜λŠ” ꡬ성 μš”μ†Œλ³„ μˆ˜μ€€μ—μ„œ κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€(아직 κ²°μ •λ˜μ§€ μ•ŠμŒ).

기본값은 {{ 및 }} μž…λ‹ˆλ‹€.

API μ œμ•ˆ

_WIP_

ComboBoxλŠ” κΈ°λ³Έ FluidComboBox ꡬ성 μš”μ†Œ, FluidComboBoxOptionsList ꡬ성 μš”μ†Œ 및 FluidComboBoxOption ꡬ성 μš”μ†Œλ‘œ λΆ„ν• λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

FluidComboBox

FluidComboBoxOptionsList λ₯Ό ν¬ν•¨ν•˜λ©°, μ—¬κΈ°μ—λŠ” μ°¨λ‘€λ‘œ FluidComboBoxOption κ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
μ˜€λ²„λ ˆμ΄ μ—΄κΈ° 및 λ‹«κΈ° 및 μ˜€λ²„λ ˆμ΄ μœ„μΉ˜ 지정을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
κΈ°λ³Έ HTMLElement sλ₯Ό ν—ˆμš©ν•˜λŠ” ν•˜μœ„ μš”μ†Œλ‘œ ν…œν”Œλ¦Ώμ„ ν—ˆμš©ν•©λ‹ˆλ‹€.

ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•  λ•Œ ν…œν”Œλ¦Ώ 바인딩에 μ‚¬μš©λ˜λŠ” μ—¬λŠ” λ¬Έμžμ—΄κ³Ό λ‹«λŠ” λ¬Έμžμ—΄μ„ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μž…λ ₯

| 이름 | μ˜ˆμ • | μœ ν˜• | κΈ°λ³Έκ°’ | μ„€λͺ… |
| -------------- | ----------- | -------- | ------- | -------------------------------------------------- ------------------------------ |
| μ˜΅μ…˜ | MVP | λ°°μ—΄ | [] | FluidComboBoxOptionsList 에 ν‘œμ‹œν•  μ˜΅μ…˜ λ°°μ—΄ |
| ν•„ν„°Fn | MVP | (option: T) => boolean | null | 필터링 μ˜΅μ…˜μ— μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ |
| λ Œλ”μ˜΅μ…˜Fn | MVP | (option: T) => string | null | μžλ™ μ™„μ„± νŒ¨λ„μ—μ„œ μ˜΅μ…˜μ„ λ Œλ”λ§ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” κΈ°λŠ₯ |
| 자리 ν‘œμ‹œμž | MVP | λ¬Έμžμ—΄ | '' | μ˜΅μ…˜μ΄ μ„ νƒλ˜μ§€ μ•Šμ€ 경우 μž…λ ₯ ν•„λ“œμ— ν‘œμ‹œν•  자리 ν‘œμ‹œμž |
| μž₯애인 | MVP | λΆ€μšΈ | 거짓 | 콀보 μƒμžκ°€ λΉ„ν™œμ„±ν™”λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” λΆ€μšΈ |
| λ‘œλ”© | MVP | λΆ€μšΈ | 거짓 | λ‘œλ”© ν‘œμ‹œκΈ°λ₯Ό ν‘œμ‹œν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” λΆ€μšΈ |
| 선택 | MVP | μ–΄λ–€ | 널 | 사전 선택 ν•­λͺ© |
| 닀쀑 선택 | v2 | λΆ€μšΈ | 거짓 | λ‘˜ μ΄μƒμ˜ μ˜΅μ…˜μ„ λ™μ‹œμ— 선택할 수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” λΆ€μšΈ |

좜λ ₯

| 이름 | μ˜ˆμ • | μœ ν˜• | μ„€λͺ… |
| ---------------- | ----------- | ---------------------------------- | -------------------------------------------------- ---- |
| λ³€κ²½ | MVP | FluidComboBoxChangeEvent | 값이 변경될 λ•Œ λ°œμƒν•˜λŠ” 이벀트 |
| ν•„ν„° κ΅ν™˜ | MVP | FluidComboBoxFilterChangeEvent | μ‚¬μš©μžκ°€ 필터링 값을 μž…λ ₯ν•˜λ©΄ λ°œμƒν•˜λŠ” 이벀트 |
| 선택 λ³€κ²½ | MVP | FluidComboBoxSelectionChangeEvent | μ„ νƒν•œ μ˜΅μ…˜μ΄ 변경될 λ•Œ λ°œμƒν•˜λŠ” 이벀트 |

FluidLoadingSpinner

FluidComboBox의 μ „μ œ 쑰건으둜 μž¬μ‚¬μš© κ°€λŠ₯ν•œ λ‘œλ”© μŠ€ν”Όλ„ˆ ꡬ성 μš”μ†Œλ₯Ό λ¨Όμ € κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
ToDo μƒˆλ‘œμš΄ λ‘œλ”© μŠ€ν”Όλ„ˆμ˜ L&F에 λŒ€ν•΄ UX에 λ¬Έμ˜ν•˜μ‹­μ‹œμ˜€(λ˜λŠ” 이전 λ””μžμΈμ„ μž¬μ‚¬μš©ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€).

FluidVirtualScroller

FluidComboBox의 μ „μ œ 쑰건으둜 가상 μŠ€ν¬λ‘€μ„ κ΅¬ν˜„ν•˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λ‹€μˆ˜μ˜ μ•„μ΄ν…œμ΄ μžˆλŠ” μ½€λ³΄λ°•μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

λ˜ν•œλ³΄μ‹­μ‹œμ˜€:
https://github.com/WICG/virtual-scroller/blob/master/README.md
https://www.sitepen.com/blog/next-generation-virtual-scrolling/
https://dev.to/adamklein/build-your-own-virtual-scroll-part-i-11ib
https://blog.logrocket.com/virtual-scrolling-core-principles-and-basic-implementation-in-react/

ν”Œλ£¨μ΄λ“œνŒμ˜€λ²„

FluidComboBox의 μ „μ œ 쑰건으둜 λ°°μΉ˜ν•  수 μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ νŒμ˜€λ²„ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
콀보 μƒμžμ˜ μž…λ ₯ μš”μ†Œ μ•„λž˜μ— μ™„λ²½ν•˜κ²Œ μžˆμŠ΅λ‹ˆλ‹€.

이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν•΄λ‹Ή ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
https://popper.js.org/docs/v2/

ν…œν”Œλ¦Ώκ³Ό κ΄€λ ¨ν•˜μ—¬ κ°œλ°œμžκ°€ ν…μŠ€νŠΈ ꡐ체만 κ°€μ§ˆ 수 μžˆλŠ” μœ μ—°μ„±μ΄ μ—†κ³  κ΄‘λ²”μœ„ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λͺ‡ 가지 μš°λ €κ°€ μžˆμŠ΅λ‹ˆλ‹€. κΈ°λŠ₯을 ν†΅ν•œ ν…μŠ€νŠΈ λ³€ν™˜μ΄λ‚˜ λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ ν•„μš”ν•œ κ²½μš°μ™€ 같은 κ°„λ‹¨ν•œ 쑰건에 λŒ€ν•΄ μƒκ°ν•΄λ³΄μ‹­μ‹œμ˜€.

λ‚΄ μ ‘κ·Ό 방식은 μΆ”κ°€ν•  수 μžˆλŠ” DocumentFragment에 넣을 수 μžˆλŠ” HTML λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ“°κΈ° κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ λ³€ν™˜ λ˜λŠ” 쑰건의 μ™„μ „ν•œ μœ μ—°μ„±μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
이λ₯Ό μœ„ν•œ κ°„λ‹¨ν•œ μ½˜μ„ΌνŠΈλ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ 컴파일이 ν•„μš”ν•˜μ§€ μ•Šλ„λ‘ λ¬Έμžμ—΄λ‘œ λ Œλ”λ§ν•  수 μžˆλŠ” JSX htm κ³Ό μœ μ‚¬ν•œ 것을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그것은 λ˜ν•œ μš°λ¦¬κ°€ ~700Bytes에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜λŠ” 맀우 μ΅œμ†Œν•œμ˜ 곡간을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

그런 λ‹€μŒ μ–΄λ–»κ²Œ λ“  λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<script type="text/template">
html`
  <span>${text}</span>
   {count > 0
     <span>occurrences ${count}</span>
   }
   </div>
`;
</script>

import { render } from "preact-render-to-string";

const template = document.createElement('template');
template.innerHTML = render(option); // option is the script that can be passed via slot or input

const fragment = temp.content;

λ˜λŠ” νƒœκ·Έκ°€ μ§€μ •λœ ν…œν”Œλ¦Ώ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templatesλ₯Ό μ‚¬μš©ν•  수

이것은 μ•„λ§ˆλ„ 더 μ΅œμ†Œν•œμ˜ μ†”λ£¨μ…˜μ΄ 될 κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν–ˆμœΌλ©° λΆˆν–‰νžˆλ„ AngularλŠ” ν…œν”Œλ¦Ώμ—μ„œ λͺ¨λ“  슀크립트 νƒœκ·Έλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. ν…œν”Œλ¦Ώ λ‚΄μ—μ„œ 슀크립트λ₯Ό μ„ μ–Έν•˜λŠ” 데 λ“œλŠ” λΉ„μš©μ€ 단 2μ„ΌνŠΈμž…λ‹ˆλ‹€.

Combobox에 ν…œν”Œλ¦Ώμ„ λ Œλ”λ§ν•˜λŠ” 방법에 λŒ€ν•œ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•  수 μžˆλŠ” μž…λ ₯이 μžˆλ„λ‘ ν•¨μˆ˜ μš°μ„  μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ†μ„±μœΌλ‘œ LitElements에 κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 그러면 λ‚˜λŠ” 이 ν•¨μˆ˜μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  μœ μ—°μ„±μ„ 가지고 μžˆλŠ” μ†ŒλΉ„μžμ—κ²Œ λ Œλ”λ§μ„ 전달할 것이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜(ν…œν”Œλ¦Ώμ— λŒ€ν•œ μž…λ ₯)λ₯Ό μ„ μ–Έν–ˆμœΌλ©° λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

κΈ°λ³Έ κ΅¬ν˜„μ€ λ‹€μŒκ³Ό 같이 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

_defaultTemplate<T>(display: string, value: T): string {
   return `<option>${display}</option>`
}

#1513μ—μ„œ λ…Όμ˜ν•œ κ²ƒμ²˜λŸΌ νŒμ˜€λ²„λ₯Ό μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 콀보 μƒμž ꡬ성 μš”μ†Œμ˜ 일뢀인 μž…λ ₯에 λŒ€ν•΄ λ…Όμ˜ν•˜κΈ°μ— μ μ ˆν•œ μž₯μ†ŒμΈμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μž…λ ₯이 μ΄ˆμ μ— 따라 컀지기 λ•Œλ¬Έμ— μž…λ ₯ ꡬ성 μš”μ†Œμ˜ μƒμžλ₯Ό ν™•μž₯ν•˜μ—¬ κ°€μž₯ 큰 μƒνƒœμ˜ 곡간을 μ°¨μ§€ν•˜λŠ” 것이 합리적이라고 μƒκ°ν•©λ‹ˆλ‹€. 가지닀.

ν˜„μž¬ μž…λ ₯은 초점이 λ§žμΆ°μ§€λ©΄ λ„ˆλΉ„κ°€ 16px μ¦κ°€ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ ˆμ΄λΈ” + μž…λ ₯을 νŒ¨λ”© 8만큼 μ΄λ™ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ΄λŠ” μ—¬λŸ¬ 컨트둀(μž…λ ₯, 선택, ...)이 μ„Έλ‘œ ν˜•μ‹ λ ˆμ΄μ•„μ›ƒμ— μžˆλŠ” 경우 λͺ¨λ“  컨트둀의 λͺ¨λ“  λ ˆμ΄λΈ”μ΄ λ‹€μŒκ³Ό κ°™μ•„μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. μ •λ ¬. λ ˆμ΄λΈ” + μž…λ ₯의 간격을 ν†΅ν•©ν•˜λŠ” 양식 컨트둀이 μ˜λ―Έκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ 선택 μ˜΅μ…˜μ— λŒ€ν•œ ν‘œμ‹œ λ¬Έμžμ—΄μ„ λ Œλ”λ§ν•˜κΈ° μœ„ν•œ μƒˆ μž…λ ₯을 μΆ”κ°€ν•˜μ—¬ μ œμ•ˆμ„ μˆ˜μ •ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μž…λ ₯

| 이름 | μ˜ˆμ • | μœ ν˜• | κΈ°λ³Έκ°’ | μ„€λͺ… |
| -------------- | ----------- | -------- | ------- | -------------------------------------------------- ------------------------------ |
| displayNameFn | MVP | (option: T) => string | (μ˜΅μ…˜) => `${μ˜΅μ…˜}` | 주어진 μ˜΅μ…˜μ— λŒ€ν•œ ν‘œμ‹œ λ¬Έμžμ—΄(HTML ν—ˆμš© μ•ˆ 됨)을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. |

이것은 λ˜ν•œ 이 λ¬Έμ œμ— λŒ€ν•œ μ‰¬μš΄ 해결책을 μ œκ³΅ν•©λ‹ˆλ‹€: #1527

λ‚΄κ°€ μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•˜λŠ” μž‘μ€ 것: ν˜„μž¬ DtComboboxλŠ” μ˜΅μ…˜μ˜ value λ₯Ό κΈ°λ³Έ "μ„ νƒλœ μ˜΅μ…˜" ν‘œμ‹œ ν…μŠ€νŠΈλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. μ˜΅μ…˜μ˜ textContent λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 훨씬 더 합리적이라고 μƒκ°ν•©λ‹ˆλ‹€.
1) textContent λŠ” 항상 UI μΉœν™”μ μΈ κ°’μž…λ‹ˆλ‹€( value λŠ” λ•Œλ•Œλ‘œ UI μΉœν™”μ μΈ κ°’μž„)
2) textContent λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 ν‘œμ€€ select κ°€ ν•˜λŠ” μΌμž…λ‹ˆλ‹€.

μ›Ή ꡬ성 μš”μ†ŒλŠ” ν–₯ν›„ ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“€κ³ μž ν•˜λŠ” 방식이 μ•„λ‹ˆλ―€λ‘œ νŒ€μ˜ μš°μ„  μˆœμœ„ 이동과 관련이 μžˆμœΌλ―€λ‘œ 이 문제λ₯Ό μ’…λ£Œν•©λ‹ˆλ‹€.

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