@eturnity/eturnity_reusable_components 8.10.0 → 8.10.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.
Files changed (405) hide show
  1. package/README.md +29 -29
  2. package/package.json +85 -84
  3. package/src/App.vue +30 -30
  4. package/src/Test.vue +64 -128
  5. package/src/assets/icons/arrow_down.svg +3 -3
  6. package/src/assets/icons/arrow_up_red.svg +3 -3
  7. package/src/assets/icons/black_spinner.svg +35 -35
  8. package/src/assets/icons/delete_icon.svg +11 -11
  9. package/src/assets/icons/delete_icon_gray.svg +11 -11
  10. package/src/assets/icons/drag_icon.svg +8 -8
  11. package/src/assets/icons/external_icon.svg +6 -6
  12. package/src/assets/icons/language_icon.svg +6 -6
  13. package/src/assets/icons/pdf_icon.svg +6 -6
  14. package/src/assets/icons/plus_button.svg +4 -4
  15. package/src/assets/icons/search_icon_black.svg +3 -3
  16. package/src/assets/icons/subposition_icon.svg +3 -3
  17. package/src/assets/icons/subposition_marker.svg +3 -3
  18. package/src/assets/icons/warning_icon.svg +3 -3
  19. package/src/assets/svgIcons/2d_active.svg +7 -7
  20. package/src/assets/svgIcons/2d_inactive.svg +8 -8
  21. package/src/assets/svgIcons/3d_active.svg +7 -7
  22. package/src/assets/svgIcons/3d_inactive.svg +8 -8
  23. package/src/assets/svgIcons/_readme.md +7 -7
  24. package/src/assets/svgIcons/accept.svg +5 -5
  25. package/src/assets/svgIcons/activate_panels_active.svg +22 -22
  26. package/src/assets/svgIcons/activate_panels_inactive.svg +20 -20
  27. package/src/assets/svgIcons/add_icon-1.svg +3 -3
  28. package/src/assets/svgIcons/add_icon.svg +4 -4
  29. package/src/assets/svgIcons/address_book.svg +3 -3
  30. package/src/assets/svgIcons/adjust_roof.svg +6 -6
  31. package/src/assets/svgIcons/after_sale_as_a_service.svg +6 -6
  32. package/src/assets/svgIcons/all_good.svg +3 -3
  33. package/src/assets/svgIcons/angle_active.svg +5 -5
  34. package/src/assets/svgIcons/angle_inactive.svg +4 -4
  35. package/src/assets/svgIcons/area_active.svg +11 -11
  36. package/src/assets/svgIcons/area_inactive.svg +26 -26
  37. package/src/assets/svgIcons/areas_tool.svg +14 -14
  38. package/src/assets/svgIcons/arrow_down.svg +3 -3
  39. package/src/assets/svgIcons/arrow_left.svg +4 -4
  40. package/src/assets/svgIcons/arrow_right.svg +4 -4
  41. package/src/assets/svgIcons/arrow_up.svg +3 -3
  42. package/src/assets/svgIcons/attachment.svg +3 -3
  43. package/src/assets/svgIcons/base_layer.svg +3 -3
  44. package/src/assets/svgIcons/battery.svg +3 -3
  45. package/src/assets/svgIcons/bell.svg +3 -3
  46. package/src/assets/svgIcons/bell_alt.svg +5 -5
  47. package/src/assets/svgIcons/bexio.svg +4 -4
  48. package/src/assets/svgIcons/bold.svg +3 -3
  49. package/src/assets/svgIcons/bom.svg +3 -3
  50. package/src/assets/svgIcons/bom_generation.svg +10 -10
  51. package/src/assets/svgIcons/bookmaker.svg +3 -3
  52. package/src/assets/svgIcons/bubble.svg +3 -3
  53. package/src/assets/svgIcons/bug.svg +5 -5
  54. package/src/assets/svgIcons/buildings.svg +55 -55
  55. package/src/assets/svgIcons/bullet_list.svg +8 -8
  56. package/src/assets/svgIcons/calendar.svg +7 -7
  57. package/src/assets/svgIcons/calendar_icon.svg +7 -7
  58. package/src/assets/svgIcons/call.svg +3 -3
  59. package/src/assets/svgIcons/camera.svg +3 -3
  60. package/src/assets/svgIcons/car.svg +3 -3
  61. package/src/assets/svgIcons/cart.svg +3 -3
  62. package/src/assets/svgIcons/charger_icon_white.svg +44 -44
  63. package/src/assets/svgIcons/checkbox.svg +3 -3
  64. package/src/assets/svgIcons/checkmark.svg +3 -3
  65. package/src/assets/svgIcons/checkmark_white.svg +4 -0
  66. package/src/assets/svgIcons/clear_formatting.svg +7 -7
  67. package/src/assets/svgIcons/clenergy.svg +3 -3
  68. package/src/assets/svgIcons/clickable_info.svg +4 -4
  69. package/src/assets/svgIcons/clickable_info_white.svg +5 -0
  70. package/src/assets/svgIcons/clip.svg +3 -3
  71. package/src/assets/svgIcons/clock.svg +17 -17
  72. package/src/assets/svgIcons/clock_full.svg +3 -3
  73. package/src/assets/svgIcons/{close_for_modals,_tool_tips.svg → close.svg} +4 -4
  74. package/src/assets/svgIcons/co_branding.svg +5 -5
  75. package/src/assets/svgIcons/collapse.svg +4 -4
  76. package/src/assets/svgIcons/collapse_all.svg +3 -3
  77. package/src/assets/svgIcons/collections.svg +3 -3
  78. package/src/assets/svgIcons/component_library.svg +7 -7
  79. package/src/assets/svgIcons/consumption_tariffs.svg +43 -43
  80. package/src/assets/svgIcons/context_menu-1.svg +6 -6
  81. package/src/assets/svgIcons/context_menu-2.svg +5 -5
  82. package/src/assets/svgIcons/context_menu.svg +5 -5
  83. package/src/assets/svgIcons/context_menu_tabs.svg +5 -5
  84. package/src/assets/svgIcons/cross.svg +4 -4
  85. package/src/assets/svgIcons/current_variant.svg +4 -4
  86. package/src/assets/svgIcons/dashboard.svg +3 -3
  87. package/src/assets/svgIcons/data_transfer.svg +3 -3
  88. package/src/assets/svgIcons/deadline.svg +4 -4
  89. package/src/assets/svgIcons/deal_flow.svg +5 -5
  90. package/src/assets/svgIcons/delete.svg +4 -4
  91. package/src/assets/svgIcons/delete_area_active.svg +16 -16
  92. package/src/assets/svgIcons/delete_area_inactive.svg +15 -15
  93. package/src/assets/svgIcons/direction_active-1.svg +12 -12
  94. package/src/assets/svgIcons/direction_active.svg +5 -5
  95. package/src/assets/svgIcons/direction_arrow.svg +4 -4
  96. package/src/assets/svgIcons/direction_inactive.svg +4 -4
  97. package/src/assets/svgIcons/dislike.svg +3 -3
  98. package/src/assets/svgIcons/distance_tool.svg +8 -8
  99. package/src/assets/svgIcons/distances_active.svg +9 -9
  100. package/src/assets/svgIcons/distances_inactive.svg +8 -8
  101. package/src/assets/svgIcons/distort_tool.svg +10 -10
  102. package/src/assets/svgIcons/distort_tool2.svg +16 -16
  103. package/src/assets/svgIcons/document.svg +3 -3
  104. package/src/assets/svgIcons/documents.svg +4 -4
  105. package/src/assets/svgIcons/downarrow.svg +3 -3
  106. package/src/assets/svgIcons/download.svg +4 -4
  107. package/src/assets/svgIcons/drag_icon.svg +8 -8
  108. package/src/assets/svgIcons/draggable_corner.svg +5 -5
  109. package/src/assets/svgIcons/draw_tool.svg +3 -3
  110. package/src/assets/svgIcons/duplicate-1.svg +8 -8
  111. package/src/assets/svgIcons/duplicate-2.svg +5 -5
  112. package/src/assets/svgIcons/duplicate.svg +4 -4
  113. package/src/assets/svgIcons/e-mobility_configurator.svg +6 -6
  114. package/src/assets/svgIcons/e_signature.svg +5 -5
  115. package/src/assets/svgIcons/edit_button.svg +3 -3
  116. package/src/assets/svgIcons/electricity_tariff.svg +3 -3
  117. package/src/assets/svgIcons/email.svg +3 -3
  118. package/src/assets/svgIcons/ems-1.svg +3 -3
  119. package/src/assets/svgIcons/ems.svg +3 -3
  120. package/src/assets/svgIcons/end_of_the_list.svg +5 -5
  121. package/src/assets/svgIcons/erase.svg +4 -4
  122. package/src/assets/svgIcons/erase_white.svg +4 -0
  123. package/src/assets/svgIcons/expand_all.svg +4 -4
  124. package/src/assets/svgIcons/export_document.svg +3 -3
  125. package/src/assets/svgIcons/external_icon.svg +5 -5
  126. package/src/assets/svgIcons/fav_icon.svg +4 -4
  127. package/src/assets/svgIcons/finance.svg +3 -3
  128. package/src/assets/svgIcons/financing_for_pv-1.svg +5 -5
  129. package/src/assets/svgIcons/financing_for_pv-2.svg +3 -3
  130. package/src/assets/svgIcons/financing_for_pv.svg +6 -6
  131. package/src/assets/svgIcons/finish-1.svg +4 -4
  132. package/src/assets/svgIcons/finish.svg +3 -3
  133. package/src/assets/svgIcons/flatten.svg +11 -11
  134. package/src/assets/svgIcons/flatten_roof.svg +20 -20
  135. package/src/assets/svgIcons/folder.svg +3 -3
  136. package/src/assets/svgIcons/free_technology.svg +5 -5
  137. package/src/assets/svgIcons/handle.svg +5 -5
  138. package/src/assets/svgIcons/heat_calc.svg +7 -7
  139. package/src/assets/svgIcons/height_equalize.svg +3 -3
  140. package/src/assets/svgIcons/height_snap.svg +3 -3
  141. package/src/assets/svgIcons/house.svg +3 -3
  142. package/src/assets/svgIcons/house_3d-1.svg +7 -7
  143. package/src/assets/svgIcons/house_3d.svg +7 -7
  144. package/src/assets/svgIcons/hybrid.svg +4 -4
  145. package/src/assets/svgIcons/inclination.svg +2 -2
  146. package/src/assets/svgIcons/info.svg +3 -3
  147. package/src/assets/svgIcons/initial_situation.svg +3 -3
  148. package/src/assets/svgIcons/integrations.svg +3 -3
  149. package/src/assets/svgIcons/intro-tour-1.svg +3 -3
  150. package/src/assets/svgIcons/intro-tour.svg +3 -3
  151. package/src/assets/svgIcons/inverter-1.svg +5 -5
  152. package/src/assets/svgIcons/inverter.svg +3 -3
  153. package/src/assets/svgIcons/italic.svg +3 -3
  154. package/src/assets/svgIcons/key.svg +3 -3
  155. package/src/assets/svgIcons/lake.svg +29 -29
  156. package/src/assets/svgIcons/layers_close.svg +4 -4
  157. package/src/assets/svgIcons/layers_open.svg +4 -4
  158. package/src/assets/svgIcons/lead_marketplace.svg +6 -6
  159. package/src/assets/svgIcons/lead_provider.svg +4 -4
  160. package/src/assets/svgIcons/length_2d.svg +2 -2
  161. package/src/assets/svgIcons/length_3d.svg +4 -4
  162. package/src/assets/svgIcons/length_calculator.svg +2 -2
  163. package/src/assets/svgIcons/length_in_2d_active.svg +12 -12
  164. package/src/assets/svgIcons/length_in_2d_inctive.svg +13 -13
  165. package/src/assets/svgIcons/light_bulb.svg +3 -3
  166. package/src/assets/svgIcons/like.svg +3 -3
  167. package/src/assets/svgIcons/line_graph.svg +3 -3
  168. package/src/assets/svgIcons/local_subsidies.svg +18 -18
  169. package/src/assets/svgIcons/location.svg +3 -3
  170. package/src/assets/svgIcons/lock.svg +3 -3
  171. package/src/assets/svgIcons/logout.svg +3 -3
  172. package/src/assets/svgIcons/loop.svg +3 -3
  173. package/src/assets/svgIcons/low-vegetation.svg +37 -37
  174. package/src/assets/svgIcons/lunch.svg +4 -4
  175. package/src/assets/svgIcons/magic_tool.svg +6 -6
  176. package/src/assets/svgIcons/map_icon.svg +5 -5
  177. package/src/assets/svgIcons/map_settings.svg +3 -3
  178. package/src/assets/svgIcons/margin_tool.svg +4 -4
  179. package/src/assets/svgIcons/meeting.svg +6 -6
  180. package/src/assets/svgIcons/module.svg +3 -3
  181. package/src/assets/svgIcons/move_copy.svg +4 -4
  182. package/src/assets/svgIcons/move_down.svg +3 -3
  183. package/src/assets/svgIcons/move_up.svg +3 -3
  184. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  185. package/src/assets/svgIcons/next.svg +4 -4
  186. package/src/assets/svgIcons/normal-tg.svg +30 -30
  187. package/src/assets/svgIcons/normal-vegetation.svg +53 -53
  188. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  189. package/src/assets/svgIcons/numbered_list.svg +6 -6
  190. package/src/assets/svgIcons/obstacle_tool.svg +8 -8
  191. package/src/assets/svgIcons/obstacle_tool_origin.svg +3 -3
  192. package/src/assets/svgIcons/offset_tool.svg +8 -8
  193. package/src/assets/svgIcons/open-tg.svg +21 -21
  194. package/src/assets/svgIcons/optimizer.svg +3 -6
  195. package/src/assets/svgIcons/outline_tool.svg +11 -11
  196. package/src/assets/svgIcons/pan_tool.svg +12 -12
  197. package/src/assets/svgIcons/panels_tool.svg +8 -8
  198. package/src/assets/svgIcons/pen_tool.svg +4 -4
  199. package/src/assets/svgIcons/picker_tool.svg +4 -4
  200. package/src/assets/svgIcons/picture.svg +3 -3
  201. package/src/assets/svgIcons/pin.svg +5 -5
  202. package/src/assets/svgIcons/plus_button.svg +4 -4
  203. package/src/assets/svgIcons/presentation.svg +3 -3
  204. package/src/assets/svgIcons/previous.svg +4 -4
  205. package/src/assets/svgIcons/profile-1.svg +4 -4
  206. package/src/assets/svgIcons/profile.svg +4 -4
  207. package/src/assets/svgIcons/profitability.svg +3 -3
  208. package/src/assets/svgIcons/project_analysis.svg +4 -4
  209. package/src/assets/svgIcons/project_settings.svg +4 -4
  210. package/src/assets/svgIcons/protected-tg.svg +47 -47
  211. package/src/assets/svgIcons/pv.svg +3 -3
  212. package/src/assets/svgIcons/question_mark.svg +3 -0
  213. package/src/assets/svgIcons/question_mark_white.svg +4 -0
  214. package/src/assets/svgIcons/quotations.svg +6 -6
  215. package/src/assets/svgIcons/redo.svg +6 -6
  216. package/src/assets/svgIcons/reorder_string.svg +3 -0
  217. package/src/assets/svgIcons/resizer.svg +5 -5
  218. package/src/assets/svgIcons/roof_layer.svg +3 -3
  219. package/src/assets/svgIcons/rotate_tool.svg +3 -3
  220. package/src/assets/svgIcons/rotate_view.svg +5 -5
  221. package/src/assets/svgIcons/ruler_tool.svg +3 -3
  222. package/src/assets/svgIcons/run_simulation.svg +3 -3
  223. package/src/assets/svgIcons/save.svg +3 -3
  224. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  225. package/src/assets/svgIcons/sea.svg +34 -34
  226. package/src/assets/svgIcons/search.svg +3 -3
  227. package/src/assets/svgIcons/security.svg +3 -3
  228. package/src/assets/svgIcons/settings.svg +3 -3
  229. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  230. package/src/assets/svgIcons/smartphone.svg +4 -4
  231. package/src/assets/svgIcons/solar_calc.svg +13 -13
  232. package/src/assets/svgIcons/solarmarkt.svg +3 -3
  233. package/src/assets/svgIcons/sorting.svg +4 -4
  234. package/src/assets/svgIcons/split.svg +12 -12
  235. package/src/assets/svgIcons/star.svg +3 -3
  236. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  237. package/src/assets/svgIcons/strikethrough.svg +4 -4
  238. package/src/assets/svgIcons/string_design.svg +5 -5
  239. package/src/assets/svgIcons/string_directions.svg +10 -10
  240. package/src/assets/svgIcons/subscriptions.svg +3 -3
  241. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  242. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  243. package/src/assets/svgIcons/subsidies.svg +3 -3
  244. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  245. package/src/assets/svgIcons/suitcase.svg +3 -3
  246. package/src/assets/svgIcons/summer.svg +3 -3
  247. package/src/assets/svgIcons/switch_polarity.svg +5 -0
  248. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  249. package/src/assets/svgIcons/transfer.svg +4 -4
  250. package/src/assets/svgIcons/transparent_warning.svg +4 -0
  251. package/src/assets/svgIcons/trim_tool.svg +4 -4
  252. package/src/assets/svgIcons/truck.svg +3 -3
  253. package/src/assets/svgIcons/underlined.svg +3 -3
  254. package/src/assets/svgIcons/undo.svg +6 -6
  255. package/src/assets/svgIcons/uparrow.svg +3 -3
  256. package/src/assets/svgIcons/update.svg +3 -3
  257. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  258. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  259. package/src/assets/svgIcons/upload_image.svg +8 -8
  260. package/src/assets/svgIcons/upload_image_tool.svg +7 -7
  261. package/src/assets/svgIcons/variants.svg +6 -6
  262. package/src/assets/svgIcons/vertical_tool.svg +3 -3
  263. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  264. package/src/assets/svgIcons/warning.svg +4 -4
  265. package/src/assets/svgIcons/warning_triangle.svg +3 -0
  266. package/src/assets/svgIcons/warning_triangle_white.svg +5 -0
  267. package/src/assets/svgIcons/way.svg +5 -5
  268. package/src/assets/svgIcons/wifi.svg +3 -3
  269. package/src/assets/svgIcons/winter.svg +3 -3
  270. package/src/assets/svgIcons/workflow_template.svg +11 -11
  271. package/src/assets/tests/__mocks__/iconCache.js +1 -1
  272. package/src/assets/tests/__mocks__/svgMock.js +1 -1
  273. package/src/assets/tests/helpers.js +12 -12
  274. package/src/assets/theme.js +46 -46
  275. package/src/components/addNewButton/AddNewButton.stories.js +17 -17
  276. package/src/components/addNewButton/addNewButton.spec.js +23 -23
  277. package/src/components/addNewButton/index.vue +66 -66
  278. package/src/components/banner/actionBanner/ActionBanner.stories.js +45 -45
  279. package/src/components/banner/actionBanner/actionBanner.spec.js +76 -76
  280. package/src/components/banner/actionBanner/index.vue +86 -86
  281. package/src/components/banner/banner/Banner.stories.js +64 -64
  282. package/src/components/banner/banner/banner.spec.js +149 -149
  283. package/src/components/banner/banner/index.vue +205 -205
  284. package/src/components/banner/infoBanner/InfoBanner.spec.js +70 -70
  285. package/src/components/banner/infoBanner/InfoBanner.stories.js +42 -42
  286. package/src/components/banner/infoBanner/index.vue +97 -97
  287. package/src/components/banner/notificationBanner/index.vue +131 -131
  288. package/src/components/buttons/buttonIcon/index.vue +172 -147
  289. package/src/components/buttons/closeButton/CloseButton.stories.js +25 -25
  290. package/src/components/buttons/closeButton/index.vue +62 -62
  291. package/src/components/buttons/mainButton/MainButton.stories.js +51 -51
  292. package/src/components/buttons/mainButton/index.vue +174 -174
  293. package/src/components/buttons/mainButton/mainButton.spec.js +35 -35
  294. package/src/components/card/Card.stories.js +79 -79
  295. package/src/components/card/card.spec.js +135 -135
  296. package/src/components/card/index.vue +116 -116
  297. package/src/components/collapsableInfoText/index.vue +127 -127
  298. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  299. package/src/components/deleteIcon/index.vue +78 -78
  300. package/src/components/draggableInputHandle/index.vue +46 -46
  301. package/src/components/dropdown/Dropdown.stories.js +53 -53
  302. package/src/components/dropdown/index.vue +138 -138
  303. package/src/components/errorMessage/index.vue +64 -64
  304. package/src/components/filter/filterSettings.vue +669 -669
  305. package/src/components/filter/index.vue +154 -154
  306. package/src/components/filter/parentDropdown.vue +91 -91
  307. package/src/components/icon/Icons.stories.js +31 -31
  308. package/src/components/icon/icon.spec.js +66 -66
  309. package/src/components/icon/iconCache.mjs +23 -23
  310. package/src/components/icon/iconCollection.vue +83 -83
  311. package/src/components/icon/index.vue +177 -177
  312. package/src/components/iconWrapper/index.vue +184 -184
  313. package/src/components/infoCard/InfoCard.stories.js +170 -170
  314. package/src/components/infoCard/defaultProps.js +7 -7
  315. package/src/components/infoCard/index.vue +152 -152
  316. package/src/components/infoCard/infoCard.spec.js +64 -64
  317. package/src/components/infoLabel/index.vue +63 -0
  318. package/src/components/infoText/constants.js +4 -4
  319. package/src/components/infoText/index.vue +641 -511
  320. package/src/components/infoText/infoText.spec.js +62 -62
  321. package/src/components/infoText/infoText.stories.js +48 -48
  322. package/src/components/infoText/placeholder.vue +225 -225
  323. package/src/components/inputs/checkbox/Checkbox.stories.js +63 -63
  324. package/src/components/inputs/checkbox/checkbox.spec.js +109 -109
  325. package/src/components/inputs/checkbox/index.vue +250 -241
  326. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  327. package/src/components/inputs/inputNumber/index.vue +985 -985
  328. package/src/components/inputs/inputNumberQuestion/index.vue +218 -218
  329. package/src/components/inputs/inputText/InputText.stories.js +70 -70
  330. package/src/components/inputs/inputText/index.vue +457 -457
  331. package/src/components/inputs/inputText/inputText.spec.js +588 -588
  332. package/src/components/inputs/radioButton/RadioButton.stories.js +77 -77
  333. package/src/components/inputs/radioButton/defaultProps.js +31 -31
  334. package/src/components/inputs/radioButton/index.vue +336 -336
  335. package/src/components/inputs/radioButton/radioButton.spec.js +306 -306
  336. package/src/components/inputs/searchInput/SearchInput.stories.js +66 -66
  337. package/src/components/inputs/searchInput/defaultProps.js +12 -12
  338. package/src/components/inputs/searchInput/index.vue +165 -165
  339. package/src/components/inputs/searchInput/searchInput.spec.js +64 -64
  340. package/src/components/inputs/select/index.vue +968 -968
  341. package/src/components/inputs/select/option/index.vue +164 -164
  342. package/src/components/inputs/select/select.stories.js +58 -58
  343. package/src/components/inputs/slider/index.vue +126 -126
  344. package/src/components/inputs/switchField/index.vue +254 -254
  345. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  346. package/src/components/inputs/textAreaInput/index.vue +204 -204
  347. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  348. package/src/components/inputs/toggle/index.vue +322 -322
  349. package/src/components/inputs/toggle/toggle.spec.js +102 -102
  350. package/src/components/label/index.vue +98 -98
  351. package/src/components/markerItem/index.vue +95 -95
  352. package/src/components/modals/actionModal/index.vue +64 -64
  353. package/src/components/modals/infoModal/index.vue +52 -52
  354. package/src/components/modals/modal/index.vue +186 -185
  355. package/src/components/modals/modal/modal.stories.js +31 -31
  356. package/src/components/navigationTabs/index.vue +114 -114
  357. package/src/components/pageSubtitle/PageSubtitle.stories.js +59 -59
  358. package/src/components/pageSubtitle/index.vue +78 -78
  359. package/src/components/pageSubtitle/pageSubtitle.spec.js +46 -46
  360. package/src/components/pageTitle/PageTitle.stories.js +95 -95
  361. package/src/components/pageTitle/index.vue +91 -91
  362. package/src/components/pageTitle/pageTitle.spec.js +46 -46
  363. package/src/components/pagination/index.vue +148 -148
  364. package/src/components/panelRangeInfo/index.vue +196 -0
  365. package/src/components/progressBar/index.vue +125 -125
  366. package/src/components/projectMarker/index.vue +300 -300
  367. package/src/components/rangeSlider/Slider.vue +578 -578
  368. package/src/components/rangeSlider/index.vue +517 -517
  369. package/src/components/rangeSlider/utils/dom.js +49 -49
  370. package/src/components/rangeSlider/utils/fns.js +26 -26
  371. package/src/components/roundTabs/index.vue +107 -107
  372. package/src/components/selectedOptions/index.vue +471 -471
  373. package/src/components/selectedOptions/selectedOptions.spec.js +176 -176
  374. package/src/components/selectedOptions/selectedOptions.stories.js +155 -155
  375. package/src/components/sideMenu/index.vue +281 -281
  376. package/src/components/spinner/Spinner.stories.js +34 -34
  377. package/src/components/spinner/index.vue +96 -96
  378. package/src/components/spinner/spinner.spec.js +69 -69
  379. package/src/components/spinnerGif/index.vue +98 -98
  380. package/src/components/tableDropdown/index.vue +685 -685
  381. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  382. package/src/components/tables/mainTable/index.vue +518 -518
  383. package/src/components/tables/viewTable/index.vue +195 -195
  384. package/src/components/tabsHeader/index.vue +95 -83
  385. package/src/components/threeDots/index.vue +413 -413
  386. package/src/components/videoThumbnail/index.vue +103 -103
  387. package/src/components/videoThumbnail/videoThumbnail.stories.js +33 -33
  388. package/src/helpers/currencyMapping.js +28 -28
  389. package/src/helpers/numberConverter.js +103 -103
  390. package/src/helpers/translateLang.js +128 -128
  391. package/src/main.js +7 -7
  392. package/src/mixins/inputValidations.js +97 -97
  393. package/src/router/dynamicRoutes.js +23 -23
  394. package/src/stories/Button.stories.js +48 -48
  395. package/src/stories/Button.vue +52 -52
  396. package/src/stories/Configure.mdx +364 -364
  397. package/src/stories/Header.stories.js +41 -41
  398. package/src/stories/Header.vue +59 -59
  399. package/src/stories/Page.stories.js +30 -30
  400. package/src/stories/Page.vue +83 -83
  401. package/src/stories/button.css +30 -30
  402. package/src/stories/header.css +32 -32
  403. package/src/stories/page.css +69 -69
  404. package/src/utils/index.js +12 -12
  405. package/src/components/stringDesign/DropdownMenu/index.vue +0 -1009
@@ -1,968 +1,968 @@
1
- <template>
2
- <Container
3
- :no-relative="noRelative"
4
- :select-width="selectWidth"
5
- @mouseenter="mouseEnterHandler"
6
- @mouseleave="mouseLeaveHandler"
7
- >
8
- <InputWrapper
9
- :align-items="alignItems"
10
- :has-label="!!label && label.length > 0"
11
- :no-relative="noRelative"
12
- >
13
- <LabelWrapper
14
- v-if="label"
15
- :data-id="labelDataId"
16
- :data-qa-id="dataQaId + '_label'"
17
- :info-text-message="!!infoTextMessage || !!$slots.infoText"
18
- >
19
- <InputLabel
20
- :font-color="
21
- labelFontColor || colorMode == 'dark' || colorMode == 'transparent'
22
- ? 'white'
23
- : 'eturnityGrey'
24
- "
25
- :font-size="fontSize"
26
- >{{ label }}
27
- <OptionalLabel v-if="labelOptional">
28
- ({{ $gettext('Optional') }})</OptionalLabel
29
- >
30
- </InputLabel>
31
- <InfoText
32
- v-if="infoTextMessage || !!$slots.infoText"
33
- :align-arrow="infoTextAlignArrow"
34
- :max-width="infoTextWidth"
35
- :size="infoTextSize"
36
- :text="infoTextMessage"
37
- :width="infoTextWidth"
38
- >
39
- <slot name="infoText"></slot>
40
- </InfoText>
41
- </LabelWrapper>
42
- <SelectButtonWrapper :disabled="disabled">
43
- <SelectButton
44
- ref="select"
45
- :bg-color="
46
- buttonBgColor || colorMode == 'dark'
47
- ? 'transparentBlack1'
48
- : colorMode == 'transparent'
49
- ? 'transparent'
50
- : 'white'
51
- "
52
- class="select-button"
53
- :color-mode="colorMode"
54
- :data-id="dataId"
55
- :data-qa-id="dataQaId"
56
- :disabled="disabled"
57
- :font-color="
58
- buttonFontColor || colorMode == 'dark' || colorMode == 'transparent'
59
- ? 'white'
60
- : 'black'
61
- "
62
- :font-size="fontSize"
63
- :has-error="hasError"
64
- :has-no-padding="isSearchBarVisible || !hasSelectButtonPadding"
65
- :height="height"
66
- :is-search-bar-visible="isSearchBarVisible"
67
- :no-relative="noRelative"
68
- :padding-left="paddingLeft"
69
- :select-height="selectHeight"
70
- :select-min-height="selectMinHeight"
71
- :select-width="selectWidth"
72
- :show-border="showBorder"
73
- :show-disabled-background="showDisabledBackground"
74
- :table-padding-left="tablePaddingLeft"
75
- @click="toggleDropdown"
76
- @keydown="onKeyDown"
77
- >
78
- <DraggableInputHandle
79
- v-if="isDraggable && !isSearchBarVisible"
80
- :height="selectHeight"
81
- />
82
- <InputText
83
- v-if="isSearchBarVisible"
84
- ref="searchInput"
85
- background-color="transparent"
86
- :font-color="
87
- buttonFontColor ||
88
- colorMode == 'dark' ||
89
- colorMode == 'transparent'
90
- ? 'white'
91
- : 'black'
92
- "
93
- :font-size="fontSize"
94
- input-height="34px"
95
- :input-width="computedWidth"
96
- :no-border="true"
97
- tabindex="0"
98
- :value="textSearch"
99
- @click.stop
100
- @input-change="searchChange"
101
- @keydown.stop="onKeyDown"
102
- />
103
- <Selector
104
- v-else
105
- :disabled="disabled"
106
- :padding-left="paddingLeft"
107
- :select-width="selectWidth"
108
- :show-border="showBorder"
109
- >
110
- <slot name="selector" :selected-value="selectedValue"></slot>
111
- </Selector>
112
- <Caret
113
- class="caret_dropdown"
114
- :color-mode="colorMode"
115
- @click.stop="toggleCaretDropdown"
116
- >
117
- <Icon
118
- v-if="isDropdownOpen"
119
- :color="
120
- caretColor || colorMode == 'dark' || colorMode == 'transparent'
121
- ? 'white'
122
- : 'transparentBlack1'
123
- "
124
- name="arrow_up"
125
- :size="colorMode === 'transparent' ? '8px' : '12px'"
126
- />
127
- <Icon
128
- v-else
129
- :color="
130
- caretColor || colorMode == 'dark' || colorMode == 'transparent'
131
- ? 'white'
132
- : 'transparentBlack1'
133
- "
134
- name="arrow_down"
135
- :size="colorMode === 'transparent' ? '8px' : '12px'"
136
- />
137
- </Caret>
138
- </SelectButton>
139
- <DropdownWrapper ref="dropdownWrapperRef" :no-relative="noRelative">
140
- <Teleport to="body">
141
- <SelectDropdown
142
- v-show="isSelectDropdownShown"
143
- ref="dropdown"
144
- :bg-color="
145
- dropdownBgColor ||
146
- colorMode == 'dark' ||
147
- colorMode == 'transparent'
148
- ? 'black'
149
- : 'white'
150
- "
151
- :dropdown-position="dropdownPosition"
152
- :font-color="
153
- dropdownFontColor ||
154
- colorMode == 'dark' ||
155
- colorMode == 'transparent'
156
- ? 'white'
157
- : 'black'
158
- "
159
- :font-size="fontSize"
160
- :hovered-bg-color="
161
- colorMode == 'dark'
162
- ? '#000000'
163
- : colorMode == 'transparent'
164
- ? 'grey6'
165
- : dropdownBgColor
166
- "
167
- :hovered-index="hoveredIndex"
168
- :hovered-value="hoveredValue"
169
- :is-active="isActive"
170
- :min-width="minWidth"
171
- :no-relative="noRelative"
172
- :option-width="getOptionWidth"
173
- :selected-value="selectedValue"
174
- @mouseleave="optionLeave"
175
- @option-hovered="optionHovered"
176
- @option-selected="optionSelected"
177
- >
178
- <slot name="dropdown"></slot>
179
- </SelectDropdown>
180
- </Teleport>
181
- </DropdownWrapper>
182
- </SelectButtonWrapper>
183
- </InputWrapper>
184
- </Container>
185
- </template>
186
-
187
- <script>
188
- //How to use it
189
- // <Select
190
- // hoverDropdown="true"
191
- // selectWidth="100%"
192
- // minWidth="220px"
193
- // optionWidth="50%"
194
- // label="that is a label"
195
- // alignItems="vertical"
196
- // label-data-id="test-label-data-id"
197
- // data-id="test-data-id"
198
- // :hasSelectButtonPadding="false"
199
- // >
200
- // <template #selector="{selectedValue}">
201
- // value selected: {{selectedValue}}
202
- // </template>
203
- // <template #dropdown>
204
- // <Option value="1">value one</Option>
205
- // <Option value="2">value two</Option>
206
- // <Option value="3">value three</Option>
207
- // <Option value="4">value four</Option>
208
- // </template>
209
- // </Select>
210
-
211
- import { Teleport } from 'vue'
212
- import styled from 'vue3-styled-components'
213
- import InfoText from '../../infoText'
214
- import Icon from '../../icon'
215
- import InputText from '../inputText'
216
- import DraggableInputHandle from '../../draggableInputHandle'
217
- import { debounce } from '../../../utils'
218
-
219
- const CARET_WIDTH = '30px'
220
- const BORDER_WIDTH = '1px'
221
-
222
- const CaretAttrs = { colorMode: String }
223
- const Caret = styled('div', CaretAttrs)`
224
- display: flex;
225
- align-items: center;
226
- justify-content: center;
227
- width: ${(props) =>
228
- props.colorMode === 'transparent' ? '15px' : CARET_WIDTH};
229
- min-width: ${(props) =>
230
- props.colorMode === 'transparent' ? '15px' : CARET_WIDTH};
231
- height: 100%;
232
- align-items: center;
233
- cursor: pointer;
234
- margin-left: auto;
235
- `
236
-
237
- const selectorProps = {
238
- disabled: Boolean,
239
- selectWidth: String,
240
- paddingLeft: String,
241
- showBorder: Boolean,
242
- }
243
- const Selector = styled('div', selectorProps)`
244
- color: ${(props) => (props.disabled ? props.theme.colors.grey2 : '')};
245
- ${(props) =>
246
- props.selectWidth === '100%'
247
- ? 'width: 100%;'
248
- : `width: calc(${props.selectWidth} -
249
- (
250
- ${CARET_WIDTH} +
251
- ${props.paddingLeft}
252
- ${props.showBorder ? `+ (${BORDER_WIDTH} * 2)` : ''}
253
- )
254
- );
255
- white-space: nowrap;
256
- text-overflow: ellipsis;
257
- overflow: hidden;`}
258
- `
259
-
260
- const labelAttrs = { fontSize: String, fontColor: String }
261
- const InputLabel = styled('div', labelAttrs)`
262
- color: ${(props) =>
263
- props.theme.colors[props.fontColor]
264
- ? props.theme.colors[props.fontColor]
265
- : props.fontColor};
266
- font-size: ${(props) => props.fontSize};
267
- font-weight: 700;
268
- `
269
- const OptionalLabel = styled.span`
270
- font-weight: 300;
271
- text-transform: lowercase;
272
- `
273
- const inputProps = {
274
- selectWidth: String,
275
- optionWidth: String,
276
- noRelative: Boolean,
277
- }
278
- const Container = styled('div', inputProps)`
279
- width: ${(props) => props.selectWidth};
280
- position: ${(props) => (props.noRelative ? 'static' : 'relative')};
281
- display: inline-block;
282
- `
283
-
284
- const LabelWrapperAttrs = { infoTextMessage: Boolean }
285
- const LabelWrapper = styled('div', LabelWrapperAttrs)`
286
- display: inline-grid;
287
- grid-template-columns: ${(props) =>
288
- props.infoTextMessage ? 'auto auto' : 'auto'};
289
- grid-gap: 12px;
290
- align-items: center;
291
- justify-content: start;
292
- `
293
-
294
- const SelectButtonWrapperAttrs = {
295
- disabled: Boolean,
296
- }
297
- const SelectButtonWrapper = styled('div', SelectButtonWrapperAttrs)`
298
- ${(props) => (props.disabled ? 'cursor: not-allowed' : 'cursor: pointer')};
299
- `
300
-
301
- const selectButtonAttrs = {
302
- bgColor: String,
303
- fontColor: String,
304
- hasError: Boolean,
305
- disabled: Boolean,
306
- selectHeight: String,
307
- selectWidth: String,
308
- height: String,
309
- selectMinHeight: String,
310
- hasNoPadding: Boolean,
311
- showBorder: Boolean,
312
- paddingLeft: String,
313
- noRelative: Boolean,
314
- tablePaddingLeft: String,
315
- showDisabledBackground: Boolean,
316
- colorMode: String,
317
- isSearchBarVisible: Boolean,
318
- }
319
- const SelectButton = styled('div', selectButtonAttrs)`
320
- position: ${(props) => (props.noRelative ? 'static' : 'relative')};
321
- box-sizing: border-box;
322
- border-radius: 4px;
323
- max-width: ${(props) => (props.selectWidth ? props.selectWidth : '100%')};
324
- ${(props) =>
325
- props.colorMode === 'transparent'
326
- ? props.isSearchBarVisible
327
- ? 'padding: 10px 15px 10px 5px;'
328
- : 'padding: 10px 15px;'
329
- : props.isSearchBarVisible
330
- ? ''
331
- : `padding-left: ${
332
- props.hasNoPadding
333
- ? '0'
334
- : props.tablePaddingLeft
335
- ? props.tablePaddingLeft
336
- : props.paddingLeft
337
- }`};
338
- text-align: left;
339
- min-height: ${(props) =>
340
- props.selectHeight
341
- ? props.selectHeight
342
- : props.selectMinHeight
343
- ? props.selectMinHeight
344
- : props.height
345
- ? props.height
346
- : '36px'};
347
- display: flex;
348
- align-items: center;
349
- height: ${(props) => props.selectHeight};
350
- ${({ showBorder, theme, hasError }) =>
351
- showBorder &&
352
- `
353
- border: ${BORDER_WIDTH} solid ${
354
- hasError ? theme.colors.red : theme.colors.grey4
355
- }
356
- `}
357
- opacity: ${(props) =>
358
- props.colorMode === 'transparent' && props.disabled ? '0.4' : '1'};
359
- background-color: ${(props) =>
360
- props.colorMode === 'transparent'
361
- ? 'transparent'
362
- : props.disabled && props.showDisabledBackground
363
- ? props.theme.colors.grey5
364
- : props.theme.colors[props.bgColor]
365
- ? props.theme.colors[props.bgColor]
366
- : props.bgColor};
367
- color: ${(props) =>
368
- props.colorMode === 'transparent'
369
- ? props.theme.colors.white
370
- : props.disabled && props.showDisabledBackground
371
- ? props.theme.colors.black
372
- : props.theme.colors[props.fontColor]
373
- ? props.theme.colors[props.fontColor]
374
- : props.fontColor};
375
- ${(props) => (props.disabled ? 'pointer-events: none' : '')};
376
- overflow: hidden;
377
- & > .handle {
378
- border-right: ${(props) =>
379
- props.hasError ? props.theme.colors.red : props.theme.colors.grey4}
380
- 1px solid;
381
- }
382
- `
383
- const selectDropdownAttrs = {
384
- hoveredBgColor: String,
385
- bgColor: String,
386
- fontColor: String,
387
- optionWidth: String,
388
- hoveredIndex: Number,
389
- fontSize: String,
390
- dropdownPosition: Object,
391
- hoveredValue: Number | String,
392
- selectedValue: Number | String,
393
- noRelative: Boolean,
394
- minWidth: String,
395
- }
396
- const SelectDropdown = styled('div', selectDropdownAttrs)`
397
- box-sizing: border-box;
398
- z-index: ${(props) => (props.isActive ? '2' : '99999')};
399
- position: absolute;
400
- top: ${(props) =>
401
- props.noRelative ? 'auto' : props.dropdownPosition?.top + 'px'};
402
- left: ${(props) => props.dropdownPosition?.left}px;
403
- border: ${BORDER_WIDTH} solid ${(props) => props.theme.colors.grey4};
404
- border-radius: 4px;
405
- display: flex;
406
- flex-direction: column;
407
- align-items: flex-start;
408
- padding: 0px;
409
- box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
410
- width: ${(props) => (props.optionWidth ? props.optionWidth : '100%')};
411
- min-width: ${(props) =>
412
- props.minWidth
413
- ? props.minWidth
414
- : props.optionWidth
415
- ? props.optionWidth
416
- : '100%'};
417
- background-color: ${(props) =>
418
- props.theme.colors[props.bgColor]
419
- ? props.theme.colors[props.bgColor]
420
- : props.bgColor};
421
- color: ${(props) =>
422
- props.theme.colors[props.fontColor]
423
- ? props.theme.colors[props.fontColor]
424
- : props.fontColor};
425
- max-height: 300px;
426
- overflow-y: auto;
427
- & > div[data-value='${(props) => props.hoveredValue}'] {
428
- background-color: ${(props) =>
429
- props.theme.colors[props.hoveredBgColor]
430
- ? props.theme.colors[props.hoveredBgColor]
431
- : props.hoveredBgColor};
432
- }
433
- font-size: ${(props) => props.fontSize};
434
- `
435
- SelectDropdown.emits = ['option-hovered', 'option-selected']
436
- const DropdownAttrs = { noRelative: Boolean }
437
- const DropdownWrapper = styled('div', DropdownAttrs)`
438
- position: ${(props) => (props.noRelative ? 'static' : 'relative')};
439
- `
440
- const inputAttrs = {
441
- alignItems: String,
442
- hasLabel: Boolean,
443
- noRelative: Boolean,
444
- }
445
- const InputWrapper = styled('div', inputAttrs)`
446
- position: ${(props) => (props.noRelative ? 'static' : 'relative')};
447
- display: grid;
448
- width: 100%;
449
- min-width: ${(props) => (props.minWidth ? props.minWidth : '150px')};
450
- align-items: center;
451
- gap: 8px;
452
- grid-template-columns: ${(props) =>
453
- props.alignItems === 'vertical' || !props.hasLabel ? '1fr' : 'auto 1fr'};
454
- `
455
-
456
- const DROPDOWN_HEIGHT_OFFSET = 4
457
- const DROPDOWN_TOP_OFFSET = 21
458
- const MIN_OPTION_LENGTH = 5
459
-
460
- const DROPDOWN_MENU_POSITIONS = {
461
- Automatic: 'automatic',
462
- Bottom: 'bottom',
463
- }
464
-
465
- export default {
466
- name: 'RCselect',
467
-
468
- components: {
469
- SelectButton,
470
- SelectButtonWrapper,
471
- SelectDropdown,
472
- Container,
473
- InputLabel,
474
- LabelWrapper,
475
- OptionalLabel,
476
- InfoText,
477
- InputWrapper,
478
- DropdownWrapper,
479
- Icon,
480
- Caret,
481
- Selector,
482
- InputText,
483
- Teleport,
484
- DraggableInputHandle,
485
- },
486
-
487
- props: {
488
- value: {
489
- required: false,
490
- default: null,
491
- },
492
- fontSize: {
493
- required: false,
494
- default: '13px',
495
- },
496
- noRelative: {
497
- required: false,
498
- default: false,
499
- },
500
- label: {
501
- required: false,
502
- },
503
- labelOptional: {
504
- required: false,
505
- default: false,
506
- },
507
- labelDataId: {
508
- required: false,
509
- default: '',
510
- },
511
- infoTextMessage: {
512
- required: false,
513
- },
514
- selectWidth: {
515
- type: String,
516
- required: false,
517
- default: '100%',
518
- },
519
- minWidth: {
520
- required: false,
521
- },
522
- maxWidth: {
523
- required: false,
524
- },
525
- selectHeight: {
526
- type: String,
527
- required: false,
528
- default: null,
529
- },
530
- height: {
531
- required: false,
532
- default: null,
533
- },
534
- selectMinHeight: {
535
- required: false,
536
- default: '36px',
537
- },
538
- optionWidth: {
539
- required: false,
540
- default: null,
541
- },
542
- hoverDropdown: {
543
- required: false,
544
- default: false,
545
- },
546
- dropdownAutoClose: {
547
- required: false,
548
- default: false,
549
- },
550
- alignItems: {
551
- required: false,
552
- default: 'horizontal',
553
- },
554
- buttonBgColor: {
555
- required: false,
556
- },
557
- buttonFontColor: {
558
- required: false,
559
- },
560
- dropdownBgColor: {
561
- required: false,
562
- default: 'grey5',
563
- },
564
- dropdownFontColor: {
565
- required: false,
566
- },
567
- dropDownArrowVisible: {
568
- required: false,
569
- default: true,
570
- },
571
- caretColor: {
572
- required: false,
573
- },
574
- labelFontColor: {
575
- required: false,
576
- },
577
- colorMode: {
578
- required: false,
579
- default: 'light',
580
- },
581
- isSearchable: {
582
- required: false,
583
- default: true,
584
- },
585
- hasError: {
586
- required: false,
587
- default: false,
588
- },
589
- disabled: {
590
- required: false,
591
- type: Boolean,
592
- default: false,
593
- },
594
- isAutoSearch: {
595
- required: false,
596
- default: true,
597
- },
598
- showBorder: {
599
- required: false,
600
- default: true,
601
- },
602
- infoTextSize: {
603
- required: false,
604
- default: '14px',
605
- },
606
- dataId: {
607
- type: String,
608
- default: '',
609
- },
610
- dataQaId: {
611
- type: String,
612
- default: '',
613
- },
614
- hasSelectButtonPadding: {
615
- required: false,
616
- type: Boolean,
617
- default: true,
618
- },
619
- isDraggable: {
620
- type: Boolean,
621
- default: false,
622
- },
623
- leftPadding: {
624
- type: String,
625
- default: '15px',
626
- },
627
- tablePaddingLeft: {
628
- required: false,
629
- },
630
- showDisabledBackground: {
631
- required: false,
632
- default: true,
633
- },
634
- minOptionLength: {
635
- type: Number,
636
- default: MIN_OPTION_LENGTH,
637
- },
638
- dropdownMenuPosition: {
639
- type: String,
640
- default: DROPDOWN_MENU_POSITIONS.Automatic, // options: ['automatic', bottom]
641
- },
642
- infoTextWidth: {
643
- type: String,
644
- required: false,
645
- },
646
- infoTextAlignArrow: {
647
- type: String,
648
- required: false,
649
- },
650
- },
651
-
652
- data() {
653
- return {
654
- selectedValue: null,
655
- paddingLeft: this.isDraggable ? '30px' : this.leftPadding,
656
- isDropdownOpen: false,
657
- isActive: false,
658
- textSearch: '',
659
- hoveredIndex: 0,
660
- isClickOutsideActive: false,
661
- dropdownPosition: {
662
- left: null,
663
- top: null,
664
- },
665
- dropdownWidth: null,
666
- hoveredValue: null,
667
- }
668
- },
669
- computed: {
670
- optionLength() {
671
- if (this.isDropdownOpen) {
672
- return this.$refs.dropdown.$el.childElementCount > 1
673
- ? this.$refs.dropdown.$el.childElementCount
674
- : this.$refs.dropdown.$el.children[0]
675
- ? this.$refs.dropdown.$el.children[0].childElementCount
676
- : 0
677
- }
678
-
679
- return 0
680
- },
681
- isSearchBarVisible() {
682
- return (
683
- this.isSearchable &&
684
- this.optionLength >= this.minOptionLength &&
685
- this.isDropdownOpen
686
- )
687
- },
688
- computedWidth() {
689
- function removePX(item) {
690
- return Number(item.replace('px', ''))
691
- }
692
-
693
- return this.selectWidth === '100%'
694
- ? '100%'
695
- : removePX(this.selectWidth) - removePX(CARET_WIDTH) + 'px'
696
- },
697
- getOptionWidth() {
698
- if (this.optionWidth) return this.optionWidth
699
-
700
- return this.dropdownWidth
701
- },
702
- isSelectDropdownShown() {
703
- return (
704
- this.isDropdownOpen &&
705
- this.dropdownPosition.left !== null &&
706
- (!this.isSearchable || this.isSearchable)
707
- )
708
- },
709
- isMobileDevice() {
710
- const userAgent =
711
- navigator.userAgent || navigator.vendor || window.opera
712
- const touchCapable =
713
- 'ontouchstart' in window ||
714
- navigator.maxTouchPoints > 0 ||
715
- navigator.msMaxTouchPoints > 0
716
-
717
- return (
718
- /Android/i.test(userAgent) ||
719
- /iPad|iPhone|iPod/.test(userAgent) ||
720
- (/Macintosh/.test(userAgent) && touchCapable) ||
721
- /windows phone/i.test(userAgent)
722
- )
723
- },
724
- },
725
- watch: {
726
- value(val) {
727
- this.selectedValue = val
728
- },
729
- async isDropdownOpen(val) {
730
- if (val) {
731
- this.$emit('on-dropdown-open')
732
- setTimeout(() => {
733
- this.isClickOutsideActive = true
734
- }, 10)
735
- await this.$nextTick()
736
- this.handleSetDropdownOffet()
737
- } else {
738
- this.dropdownPosition.left = null
739
- setTimeout(() => {
740
- this.isClickOutsideActive = false
741
- }, 10)
742
- }
743
- if (val && this.isSearchable) {
744
- this.$nextTick(() => {
745
- if (this.$refs.searchInput && !this.isMobileDevice) {
746
- this.$refs.searchInput.$el.querySelector('input').focus()
747
- }
748
- })
749
- }
750
- },
751
- },
752
- mounted() {
753
- this.observeDropdownHeight()
754
- this.observeSelectWidth()
755
- window.addEventListener('resize', this.handleSetDropdownOffet)
756
- },
757
- beforeMount() {
758
- this.selectedValue = this.value
759
- document.addEventListener('click', this.clickOutside)
760
- this.getDropdownPosition()
761
- window.removeEventListener('resize', this.handleSetDropdownOffet)
762
- if (this.dropdownResizeObserver) this.dropdownResizeObserver.disconnect()
763
- if (this.selectResizeObserver) this.selectResizeObserver.disconnect()
764
- },
765
- unmounted() {
766
- document.removeEventListener('click', this.clickOutside)
767
- },
768
- methods: {
769
- focus() {
770
- this.isActive = true
771
- },
772
- blur(e) {
773
- this.isActive = false
774
- this.$emit('blur', e)
775
- },
776
- toggleDropdown() {
777
- this.isDropdownOpen = !this.isDropdownOpen
778
- },
779
- toggleCaretDropdown() {
780
- this.isDropdownOpen = !this.isDropdownOpen
781
- },
782
- closeDropdown() {
783
- this.blur()
784
- this.clearSearch()
785
- this.isDropdownOpen = false
786
- },
787
- clearSearch() {
788
- this.textSearch = ''
789
- this.searchChange('')
790
- },
791
- optionSelected(e) {
792
- this.selectedValue = e
793
- this.closeDropdown()
794
- this.blur()
795
- this.$emit('input-change', e)
796
- },
797
- optionHovered: debounce(function (e) {
798
- this.hoveredValue = e
799
- }, 300),
800
- mouseEnterHandler() {
801
- if (this.hoverDropdown) {
802
- this.focus()
803
- this.isDropdownOpen = true
804
- }
805
- },
806
- mouseLeaveHandler() {
807
- if (this.hoverDropdown) {
808
- this.blur()
809
- }
810
- },
811
- optionLeave() {
812
- if (this.dropdownAutoClose) {
813
- this.isDropdownOpen = false
814
- }
815
- },
816
- searchChange(value) {
817
- this.textSearch = value
818
- this.$emit('search-change', value)
819
- const dropdownChildren = [...this.$refs.dropdown.$el.children]
820
- dropdownChildren.forEach((el) => {
821
- if (!el.textContent.toLowerCase().includes(value.toLowerCase())) {
822
- el.style.display = 'none'
823
-
824
- return
825
- }
826
-
827
- el.style.display = 'inherit'
828
- })
829
- },
830
- clickOutside(event) {
831
- const dropdownRef = this.$refs.dropdown
832
- // we need to prevent closing on selecting an option, because in the case of
833
- // a disabled option, we don't want to close the dropdown
834
- if (!this.isClickOutsideActive) return
835
- if (
836
- this.$refs.select.$el == event.target ||
837
- this.$refs.select.$el.contains(event.target) ||
838
- event.target.id === 'more-button' ||
839
- event.target.parentNode === dropdownRef.$el
840
- ) {
841
- return
842
- } else {
843
- this.closeDropdown()
844
- }
845
- },
846
- onKeyDown(e) {
847
- if (e.key == 'ArrowDown') {
848
- this.onArrowPress(1)
849
- } else if (e.key == 'ArrowUp') {
850
- this.onArrowPress(-1)
851
- } else if (e.key == 'Enter') {
852
- const optionHoveredComponent = [...this.$refs.dropdown.$el.children][
853
- (this.hoveredIndex - 1 + this.optionLength) % this.optionLength
854
- ]
855
- this.optionSelected(optionHoveredComponent.$el.dataset.value)
856
- }
857
- },
858
- // If some part of the dropdown menu is outside viewport of the bottom of the screen,
859
- // we need to offset it and display it at the top of the select dropdown instead
860
- async getDropdownPosition() {
861
- if (
862
- !this.$refs.dropdownWrapperRef ||
863
- !this.$refs.select ||
864
- !this.$refs.dropdown
865
- ) {
866
- return
867
- }
868
- await this.$nextTick()
869
- const isDisplayedAtBottom = await this.generateDropdownPosition()
870
- // If the dropdown menu is going to be displayed at the bottom,
871
- // we need reverify its position after a dom update (nextTick)
872
- await this.$nextTick()
873
- if (isDisplayedAtBottom) this.generateDropdownPosition()
874
- },
875
- async generateDropdownPosition() {
876
- const isDropdownNotCompletelyVisible =
877
- await this.isBottomOfDropdownOutOfViewport()
878
- const dropdownWrapperEl = this.$refs.dropdownWrapperRef.$el
879
- const selectButtonHeight = this.$refs.select.$el.clientHeight
880
- const dropdownHeight = this.$refs.dropdown.$el.clientHeight
881
- const dropdownWrapperRelativeHeight =
882
- dropdownWrapperEl.getBoundingClientRect().top +
883
- window.scrollY +
884
- DROPDOWN_HEIGHT_OFFSET
885
-
886
- const top =
887
- isDropdownNotCompletelyVisible ||
888
- (!isDropdownNotCompletelyVisible &&
889
- this.dropdownMenuPosition === DROPDOWN_MENU_POSITIONS.Bottom)
890
- ? dropdownWrapperRelativeHeight
891
- : dropdownWrapperRelativeHeight -
892
- dropdownHeight -
893
- selectButtonHeight -
894
- DROPDOWN_TOP_OFFSET
895
- const left = this.dropdownPosition.left
896
- ? this.dropdownPosition.left
897
- : dropdownWrapperEl.getBoundingClientRect().left + window.scrollX
898
-
899
- this.dropdownPosition = { left: Math.floor(left), top: Math.floor(top) }
900
-
901
- return isDropdownNotCompletelyVisible
902
- },
903
- async isBottomOfDropdownOutOfViewport() {
904
- if (
905
- !this.$refs.dropdown ||
906
- this.dropdownMenuPosition === DROPDOWN_MENU_POSITIONS.Bottom
907
- ) {
908
- return false
909
- }
910
-
911
- await this.$nextTick()
912
- const rect = this.$refs.dropdown.$el.getBoundingClientRect()
913
- const windowHeight =
914
- window.innerHeight || document.documentElement.clientHeight
915
-
916
- if (windowHeight <= 650) return true
917
-
918
- // using Math.floor because the offsets may contain decimals we are not going to consider here
919
- return Math.floor(rect.top) + Math.floor(rect.height) <= windowHeight
920
- },
921
- observeDropdownHeight() {
922
- if (!this.$refs.dropdown) return
923
- this.dropdownResizeObserver = new ResizeObserver(() => {
924
- this.$nextTick(() => this.getDropdownPosition())
925
- })
926
- this.dropdownResizeObserver.observe(this.$refs.dropdown.$el)
927
- },
928
- handleSetDropdownOffet() {
929
- if (!this.$refs.select) return
930
- this.dropdownPosition.left = Math.floor(
931
- this.$refs.select.$el.getBoundingClientRect().left
932
- )
933
- this.getDropdownWidth()
934
- },
935
- observeSelectWidth() {
936
- if (!this.$refs.select) return
937
- this.selectResizeObserver = new ResizeObserver(() =>
938
- // eslint-disable-next-line vue/valid-next-tick
939
- this.$nextTick(() => this.getDropdownWidth())
940
- )
941
- this.selectResizeObserver.observe(this.$refs.dropdown.$el)
942
- },
943
- async getDropdownWidth() {
944
- if (!this.$refs.select) return
945
- await this.$nextTick()
946
- this.dropdownWidth = `${this.$refs.select.$el.clientWidth}px`
947
- },
948
- onArrowPress(dir) {
949
- let newHoveredElem
950
- const currentHoveredElem = this.$refs.dropdown.$el.querySelector(
951
- `[data-value="${this.hoveredValue}"]`
952
- )
953
- if (currentHoveredElem) {
954
- if (dir > 0) {
955
- newHoveredElem = currentHoveredElem.nextElementSibling
956
- } else {
957
- newHoveredElem = currentHoveredElem.previousElementSibling
958
- }
959
- if (newHoveredElem) {
960
- this.hoveredValue = newHoveredElem.getAttribute('data-value')
961
- const topPos = newHoveredElem.offsetTop
962
- this.$refs.dropdown.$el.scrollTop = topPos
963
- }
964
- }
965
- },
966
- },
967
- }
968
- </script>
1
+ <template>
2
+ <Container
3
+ :no-relative="noRelative"
4
+ :select-width="selectWidth"
5
+ @mouseenter="mouseEnterHandler"
6
+ @mouseleave="mouseLeaveHandler"
7
+ >
8
+ <InputWrapper
9
+ :align-items="alignItems"
10
+ :has-label="!!label && label.length > 0"
11
+ :no-relative="noRelative"
12
+ >
13
+ <LabelWrapper
14
+ v-if="label"
15
+ :data-id="labelDataId"
16
+ :data-qa-id="dataQaId + '_label'"
17
+ :info-text-message="!!infoTextMessage || !!$slots.infoText"
18
+ >
19
+ <InputLabel
20
+ :font-color="
21
+ labelFontColor || colorMode == 'dark' || colorMode == 'transparent'
22
+ ? 'white'
23
+ : 'eturnityGrey'
24
+ "
25
+ :font-size="fontSize"
26
+ >{{ label }}
27
+ <OptionalLabel v-if="labelOptional">
28
+ ({{ $gettext('Optional') }})</OptionalLabel
29
+ >
30
+ </InputLabel>
31
+ <InfoText
32
+ v-if="infoTextMessage || !!$slots.infoText"
33
+ :align-arrow="infoTextAlignArrow"
34
+ :max-width="infoTextWidth"
35
+ :size="infoTextSize"
36
+ :text="infoTextMessage"
37
+ :width="infoTextWidth"
38
+ >
39
+ <slot name="infoText"></slot>
40
+ </InfoText>
41
+ </LabelWrapper>
42
+ <SelectButtonWrapper :disabled="disabled">
43
+ <SelectButton
44
+ ref="select"
45
+ :bg-color="
46
+ buttonBgColor || colorMode == 'dark'
47
+ ? 'transparentBlack1'
48
+ : colorMode == 'transparent'
49
+ ? 'transparent'
50
+ : 'white'
51
+ "
52
+ class="select-button"
53
+ :color-mode="colorMode"
54
+ :data-id="dataId"
55
+ :data-qa-id="dataQaId"
56
+ :disabled="disabled"
57
+ :font-color="
58
+ buttonFontColor || colorMode == 'dark' || colorMode == 'transparent'
59
+ ? 'white'
60
+ : 'black'
61
+ "
62
+ :font-size="fontSize"
63
+ :has-error="hasError"
64
+ :has-no-padding="isSearchBarVisible || !hasSelectButtonPadding"
65
+ :height="height"
66
+ :is-search-bar-visible="isSearchBarVisible"
67
+ :no-relative="noRelative"
68
+ :padding-left="paddingLeft"
69
+ :select-height="selectHeight"
70
+ :select-min-height="selectMinHeight"
71
+ :select-width="selectWidth"
72
+ :show-border="showBorder"
73
+ :show-disabled-background="showDisabledBackground"
74
+ :table-padding-left="tablePaddingLeft"
75
+ @click="toggleDropdown"
76
+ @keydown="onKeyDown"
77
+ >
78
+ <DraggableInputHandle
79
+ v-if="isDraggable && !isSearchBarVisible"
80
+ :height="selectHeight"
81
+ />
82
+ <InputText
83
+ v-if="isSearchBarVisible"
84
+ ref="searchInput"
85
+ background-color="transparent"
86
+ :font-color="
87
+ buttonFontColor ||
88
+ colorMode == 'dark' ||
89
+ colorMode == 'transparent'
90
+ ? 'white'
91
+ : 'black'
92
+ "
93
+ :font-size="fontSize"
94
+ input-height="34px"
95
+ :input-width="computedWidth"
96
+ :no-border="true"
97
+ tabindex="0"
98
+ :value="textSearch"
99
+ @click.stop
100
+ @input-change="searchChange"
101
+ @keydown.stop="onKeyDown"
102
+ />
103
+ <Selector
104
+ v-else
105
+ :disabled="disabled"
106
+ :padding-left="paddingLeft"
107
+ :select-width="selectWidth"
108
+ :show-border="showBorder"
109
+ >
110
+ <slot name="selector" :selected-value="selectedValue"></slot>
111
+ </Selector>
112
+ <Caret
113
+ class="caret_dropdown"
114
+ :color-mode="colorMode"
115
+ @click.stop="toggleCaretDropdown"
116
+ >
117
+ <Icon
118
+ v-if="isDropdownOpen"
119
+ :color="
120
+ caretColor || colorMode == 'dark' || colorMode == 'transparent'
121
+ ? 'white'
122
+ : 'transparentBlack1'
123
+ "
124
+ name="arrow_up"
125
+ :size="colorMode === 'transparent' ? '8px' : '12px'"
126
+ />
127
+ <Icon
128
+ v-else
129
+ :color="
130
+ caretColor || colorMode == 'dark' || colorMode == 'transparent'
131
+ ? 'white'
132
+ : 'transparentBlack1'
133
+ "
134
+ name="arrow_down"
135
+ :size="colorMode === 'transparent' ? '8px' : '12px'"
136
+ />
137
+ </Caret>
138
+ </SelectButton>
139
+ <DropdownWrapper ref="dropdownWrapperRef" :no-relative="noRelative">
140
+ <Teleport to="body">
141
+ <SelectDropdown
142
+ v-show="isSelectDropdownShown"
143
+ ref="dropdown"
144
+ :bg-color="
145
+ dropdownBgColor ||
146
+ colorMode == 'dark' ||
147
+ colorMode == 'transparent'
148
+ ? 'black'
149
+ : 'white'
150
+ "
151
+ :dropdown-position="dropdownPosition"
152
+ :font-color="
153
+ dropdownFontColor ||
154
+ colorMode == 'dark' ||
155
+ colorMode == 'transparent'
156
+ ? 'white'
157
+ : 'black'
158
+ "
159
+ :font-size="fontSize"
160
+ :hovered-bg-color="
161
+ colorMode == 'dark'
162
+ ? '#000000'
163
+ : colorMode == 'transparent'
164
+ ? 'grey6'
165
+ : dropdownBgColor
166
+ "
167
+ :hovered-index="hoveredIndex"
168
+ :hovered-value="hoveredValue"
169
+ :is-active="isActive"
170
+ :min-width="minWidth"
171
+ :no-relative="noRelative"
172
+ :option-width="getOptionWidth"
173
+ :selected-value="selectedValue"
174
+ @mouseleave="optionLeave"
175
+ @option-hovered="optionHovered"
176
+ @option-selected="optionSelected"
177
+ >
178
+ <slot name="dropdown"></slot>
179
+ </SelectDropdown>
180
+ </Teleport>
181
+ </DropdownWrapper>
182
+ </SelectButtonWrapper>
183
+ </InputWrapper>
184
+ </Container>
185
+ </template>
186
+
187
+ <script>
188
+ //How to use it
189
+ // <Select
190
+ // hoverDropdown="true"
191
+ // selectWidth="100%"
192
+ // minWidth="220px"
193
+ // optionWidth="50%"
194
+ // label="that is a label"
195
+ // alignItems="vertical"
196
+ // label-data-id="test-label-data-id"
197
+ // data-id="test-data-id"
198
+ // :hasSelectButtonPadding="false"
199
+ // >
200
+ // <template #selector="{selectedValue}">
201
+ // value selected: {{selectedValue}}
202
+ // </template>
203
+ // <template #dropdown>
204
+ // <Option value="1">value one</Option>
205
+ // <Option value="2">value two</Option>
206
+ // <Option value="3">value three</Option>
207
+ // <Option value="4">value four</Option>
208
+ // </template>
209
+ // </Select>
210
+
211
+ import { Teleport } from 'vue'
212
+ import styled from 'vue3-styled-components'
213
+ import InfoText from '../../infoText'
214
+ import Icon from '../../icon'
215
+ import InputText from '../inputText'
216
+ import DraggableInputHandle from '../../draggableInputHandle'
217
+ import { debounce } from '../../../utils'
218
+
219
+ const CARET_WIDTH = '30px'
220
+ const BORDER_WIDTH = '1px'
221
+
222
+ const CaretAttrs = { colorMode: String }
223
+ const Caret = styled('div', CaretAttrs)`
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ width: ${(props) =>
228
+ props.colorMode === 'transparent' ? '15px' : CARET_WIDTH};
229
+ min-width: ${(props) =>
230
+ props.colorMode === 'transparent' ? '15px' : CARET_WIDTH};
231
+ height: 100%;
232
+ align-items: center;
233
+ cursor: pointer;
234
+ margin-left: auto;
235
+ `
236
+
237
+ const selectorProps = {
238
+ disabled: Boolean,
239
+ selectWidth: String,
240
+ paddingLeft: String,
241
+ showBorder: Boolean,
242
+ }
243
+ const Selector = styled('div', selectorProps)`
244
+ color: ${(props) => (props.disabled ? props.theme.colors.grey2 : '')};
245
+ ${(props) =>
246
+ props.selectWidth === '100%'
247
+ ? 'width: 100%;'
248
+ : `width: calc(${props.selectWidth} -
249
+ (
250
+ ${CARET_WIDTH} +
251
+ ${props.paddingLeft}
252
+ ${props.showBorder ? `+ (${BORDER_WIDTH} * 2)` : ''}
253
+ )
254
+ );
255
+ white-space: nowrap;
256
+ text-overflow: ellipsis;
257
+ overflow: hidden;`}
258
+ `
259
+
260
+ const labelAttrs = { fontSize: String, fontColor: String }
261
+ const InputLabel = styled('div', labelAttrs)`
262
+ color: ${(props) =>
263
+ props.theme.colors[props.fontColor]
264
+ ? props.theme.colors[props.fontColor]
265
+ : props.fontColor};
266
+ font-size: ${(props) => props.fontSize};
267
+ font-weight: 700;
268
+ `
269
+ const OptionalLabel = styled.span`
270
+ font-weight: 300;
271
+ text-transform: lowercase;
272
+ `
273
+ const inputProps = {
274
+ selectWidth: String,
275
+ optionWidth: String,
276
+ noRelative: Boolean,
277
+ }
278
+ const Container = styled('div', inputProps)`
279
+ width: ${(props) => props.selectWidth};
280
+ position: ${(props) => (props.noRelative ? 'static' : 'relative')};
281
+ display: inline-block;
282
+ `
283
+
284
+ const LabelWrapperAttrs = { infoTextMessage: Boolean }
285
+ const LabelWrapper = styled('div', LabelWrapperAttrs)`
286
+ display: inline-grid;
287
+ grid-template-columns: ${(props) =>
288
+ props.infoTextMessage ? 'auto auto' : 'auto'};
289
+ grid-gap: 12px;
290
+ align-items: center;
291
+ justify-content: start;
292
+ `
293
+
294
+ const SelectButtonWrapperAttrs = {
295
+ disabled: Boolean,
296
+ }
297
+ const SelectButtonWrapper = styled('div', SelectButtonWrapperAttrs)`
298
+ ${(props) => (props.disabled ? 'cursor: not-allowed' : 'cursor: pointer')};
299
+ `
300
+
301
+ const selectButtonAttrs = {
302
+ bgColor: String,
303
+ fontColor: String,
304
+ hasError: Boolean,
305
+ disabled: Boolean,
306
+ selectHeight: String,
307
+ selectWidth: String,
308
+ height: String,
309
+ selectMinHeight: String,
310
+ hasNoPadding: Boolean,
311
+ showBorder: Boolean,
312
+ paddingLeft: String,
313
+ noRelative: Boolean,
314
+ tablePaddingLeft: String,
315
+ showDisabledBackground: Boolean,
316
+ colorMode: String,
317
+ isSearchBarVisible: Boolean,
318
+ }
319
+ const SelectButton = styled('div', selectButtonAttrs)`
320
+ position: ${(props) => (props.noRelative ? 'static' : 'relative')};
321
+ box-sizing: border-box;
322
+ border-radius: 4px;
323
+ max-width: ${(props) => (props.selectWidth ? props.selectWidth : '100%')};
324
+ ${(props) =>
325
+ props.colorMode === 'transparent'
326
+ ? props.isSearchBarVisible
327
+ ? 'padding: 10px 15px 10px 5px;'
328
+ : 'padding: 10px 15px;'
329
+ : props.isSearchBarVisible
330
+ ? ''
331
+ : `padding-left: ${
332
+ props.hasNoPadding
333
+ ? '0'
334
+ : props.tablePaddingLeft
335
+ ? props.tablePaddingLeft
336
+ : props.paddingLeft
337
+ }`};
338
+ text-align: left;
339
+ min-height: ${(props) =>
340
+ props.selectHeight
341
+ ? props.selectHeight
342
+ : props.selectMinHeight
343
+ ? props.selectMinHeight
344
+ : props.height
345
+ ? props.height
346
+ : '36px'};
347
+ display: flex;
348
+ align-items: center;
349
+ height: ${(props) => props.selectHeight};
350
+ ${({ showBorder, theme, hasError }) =>
351
+ showBorder &&
352
+ `
353
+ border: ${BORDER_WIDTH} solid ${
354
+ hasError ? theme.colors.red : theme.colors.grey4
355
+ }
356
+ `}
357
+ opacity: ${(props) =>
358
+ props.colorMode === 'transparent' && props.disabled ? '0.4' : '1'};
359
+ background-color: ${(props) =>
360
+ props.colorMode === 'transparent'
361
+ ? 'transparent'
362
+ : props.disabled && props.showDisabledBackground
363
+ ? props.theme.colors.grey5
364
+ : props.theme.colors[props.bgColor]
365
+ ? props.theme.colors[props.bgColor]
366
+ : props.bgColor};
367
+ color: ${(props) =>
368
+ props.colorMode === 'transparent'
369
+ ? props.theme.colors.white
370
+ : props.disabled && props.showDisabledBackground
371
+ ? props.theme.colors.black
372
+ : props.theme.colors[props.fontColor]
373
+ ? props.theme.colors[props.fontColor]
374
+ : props.fontColor};
375
+ ${(props) => (props.disabled ? 'pointer-events: none' : '')};
376
+ overflow: hidden;
377
+ & > .handle {
378
+ border-right: ${(props) =>
379
+ props.hasError ? props.theme.colors.red : props.theme.colors.grey4}
380
+ 1px solid;
381
+ }
382
+ `
383
+ const selectDropdownAttrs = {
384
+ hoveredBgColor: String,
385
+ bgColor: String,
386
+ fontColor: String,
387
+ optionWidth: String,
388
+ hoveredIndex: Number,
389
+ fontSize: String,
390
+ dropdownPosition: Object,
391
+ hoveredValue: Number | String,
392
+ selectedValue: Number | String,
393
+ noRelative: Boolean,
394
+ minWidth: String,
395
+ }
396
+ const SelectDropdown = styled('div', selectDropdownAttrs)`
397
+ box-sizing: border-box;
398
+ z-index: ${(props) => (props.isActive ? '2' : '99999')};
399
+ position: absolute;
400
+ top: ${(props) =>
401
+ props.noRelative ? 'auto' : props.dropdownPosition?.top + 'px'};
402
+ left: ${(props) => props.dropdownPosition?.left}px;
403
+ border: ${BORDER_WIDTH} solid ${(props) => props.theme.colors.grey4};
404
+ border-radius: 4px;
405
+ display: flex;
406
+ flex-direction: column;
407
+ align-items: flex-start;
408
+ padding: 0px;
409
+ box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
410
+ width: ${(props) => (props.optionWidth ? props.optionWidth : '100%')};
411
+ min-width: ${(props) =>
412
+ props.minWidth
413
+ ? props.minWidth
414
+ : props.optionWidth
415
+ ? props.optionWidth
416
+ : '100%'};
417
+ background-color: ${(props) =>
418
+ props.theme.colors[props.bgColor]
419
+ ? props.theme.colors[props.bgColor]
420
+ : props.bgColor};
421
+ color: ${(props) =>
422
+ props.theme.colors[props.fontColor]
423
+ ? props.theme.colors[props.fontColor]
424
+ : props.fontColor};
425
+ max-height: 300px;
426
+ overflow-y: auto;
427
+ & > div[data-value='${(props) => props.hoveredValue}'] {
428
+ background-color: ${(props) =>
429
+ props.theme.colors[props.hoveredBgColor]
430
+ ? props.theme.colors[props.hoveredBgColor]
431
+ : props.hoveredBgColor};
432
+ }
433
+ font-size: ${(props) => props.fontSize};
434
+ `
435
+ SelectDropdown.emits = ['option-hovered', 'option-selected']
436
+ const DropdownAttrs = { noRelative: Boolean }
437
+ const DropdownWrapper = styled('div', DropdownAttrs)`
438
+ position: ${(props) => (props.noRelative ? 'static' : 'relative')};
439
+ `
440
+ const inputAttrs = {
441
+ alignItems: String,
442
+ hasLabel: Boolean,
443
+ noRelative: Boolean,
444
+ }
445
+ const InputWrapper = styled('div', inputAttrs)`
446
+ position: ${(props) => (props.noRelative ? 'static' : 'relative')};
447
+ display: grid;
448
+ width: 100%;
449
+ min-width: ${(props) => (props.minWidth ? props.minWidth : '150px')};
450
+ align-items: center;
451
+ gap: 8px;
452
+ grid-template-columns: ${(props) =>
453
+ props.alignItems === 'vertical' || !props.hasLabel ? '1fr' : 'auto 1fr'};
454
+ `
455
+
456
+ const DROPDOWN_HEIGHT_OFFSET = 4
457
+ const DROPDOWN_TOP_OFFSET = 21
458
+ const MIN_OPTION_LENGTH = 5
459
+
460
+ const DROPDOWN_MENU_POSITIONS = {
461
+ Automatic: 'automatic',
462
+ Bottom: 'bottom',
463
+ }
464
+
465
+ export default {
466
+ name: 'RCselect',
467
+
468
+ components: {
469
+ SelectButton,
470
+ SelectButtonWrapper,
471
+ SelectDropdown,
472
+ Container,
473
+ InputLabel,
474
+ LabelWrapper,
475
+ OptionalLabel,
476
+ InfoText,
477
+ InputWrapper,
478
+ DropdownWrapper,
479
+ Icon,
480
+ Caret,
481
+ Selector,
482
+ InputText,
483
+ Teleport,
484
+ DraggableInputHandle,
485
+ },
486
+
487
+ props: {
488
+ value: {
489
+ required: false,
490
+ default: null,
491
+ },
492
+ fontSize: {
493
+ required: false,
494
+ default: '13px',
495
+ },
496
+ noRelative: {
497
+ required: false,
498
+ default: false,
499
+ },
500
+ label: {
501
+ required: false,
502
+ },
503
+ labelOptional: {
504
+ required: false,
505
+ default: false,
506
+ },
507
+ labelDataId: {
508
+ required: false,
509
+ default: '',
510
+ },
511
+ infoTextMessage: {
512
+ required: false,
513
+ },
514
+ selectWidth: {
515
+ type: String,
516
+ required: false,
517
+ default: '100%',
518
+ },
519
+ minWidth: {
520
+ required: false,
521
+ },
522
+ maxWidth: {
523
+ required: false,
524
+ },
525
+ selectHeight: {
526
+ type: String,
527
+ required: false,
528
+ default: null,
529
+ },
530
+ height: {
531
+ required: false,
532
+ default: null,
533
+ },
534
+ selectMinHeight: {
535
+ required: false,
536
+ default: '36px',
537
+ },
538
+ optionWidth: {
539
+ required: false,
540
+ default: null,
541
+ },
542
+ hoverDropdown: {
543
+ required: false,
544
+ default: false,
545
+ },
546
+ dropdownAutoClose: {
547
+ required: false,
548
+ default: false,
549
+ },
550
+ alignItems: {
551
+ required: false,
552
+ default: 'horizontal',
553
+ },
554
+ buttonBgColor: {
555
+ required: false,
556
+ },
557
+ buttonFontColor: {
558
+ required: false,
559
+ },
560
+ dropdownBgColor: {
561
+ required: false,
562
+ default: 'grey5',
563
+ },
564
+ dropdownFontColor: {
565
+ required: false,
566
+ },
567
+ dropDownArrowVisible: {
568
+ required: false,
569
+ default: true,
570
+ },
571
+ caretColor: {
572
+ required: false,
573
+ },
574
+ labelFontColor: {
575
+ required: false,
576
+ },
577
+ colorMode: {
578
+ required: false,
579
+ default: 'light',
580
+ },
581
+ isSearchable: {
582
+ required: false,
583
+ default: true,
584
+ },
585
+ hasError: {
586
+ required: false,
587
+ default: false,
588
+ },
589
+ disabled: {
590
+ required: false,
591
+ type: Boolean,
592
+ default: false,
593
+ },
594
+ isAutoSearch: {
595
+ required: false,
596
+ default: true,
597
+ },
598
+ showBorder: {
599
+ required: false,
600
+ default: true,
601
+ },
602
+ infoTextSize: {
603
+ required: false,
604
+ default: '14px',
605
+ },
606
+ dataId: {
607
+ type: String,
608
+ default: '',
609
+ },
610
+ dataQaId: {
611
+ type: String,
612
+ default: '',
613
+ },
614
+ hasSelectButtonPadding: {
615
+ required: false,
616
+ type: Boolean,
617
+ default: true,
618
+ },
619
+ isDraggable: {
620
+ type: Boolean,
621
+ default: false,
622
+ },
623
+ leftPadding: {
624
+ type: String,
625
+ default: '15px',
626
+ },
627
+ tablePaddingLeft: {
628
+ required: false,
629
+ },
630
+ showDisabledBackground: {
631
+ required: false,
632
+ default: true,
633
+ },
634
+ minOptionLength: {
635
+ type: Number,
636
+ default: MIN_OPTION_LENGTH,
637
+ },
638
+ dropdownMenuPosition: {
639
+ type: String,
640
+ default: DROPDOWN_MENU_POSITIONS.Automatic, // options: ['automatic', bottom]
641
+ },
642
+ infoTextWidth: {
643
+ type: String,
644
+ required: false,
645
+ },
646
+ infoTextAlignArrow: {
647
+ type: String,
648
+ required: false,
649
+ },
650
+ },
651
+
652
+ data() {
653
+ return {
654
+ selectedValue: null,
655
+ paddingLeft: this.isDraggable ? '30px' : this.leftPadding,
656
+ isDropdownOpen: false,
657
+ isActive: false,
658
+ textSearch: '',
659
+ hoveredIndex: 0,
660
+ isClickOutsideActive: false,
661
+ dropdownPosition: {
662
+ left: null,
663
+ top: null,
664
+ },
665
+ dropdownWidth: null,
666
+ hoveredValue: null,
667
+ }
668
+ },
669
+ computed: {
670
+ optionLength() {
671
+ if (this.isDropdownOpen) {
672
+ return this.$refs.dropdown.$el.childElementCount > 1
673
+ ? this.$refs.dropdown.$el.childElementCount
674
+ : this.$refs.dropdown.$el.children[0]
675
+ ? this.$refs.dropdown.$el.children[0].childElementCount
676
+ : 0
677
+ }
678
+
679
+ return 0
680
+ },
681
+ isSearchBarVisible() {
682
+ return (
683
+ this.isSearchable &&
684
+ this.optionLength >= this.minOptionLength &&
685
+ this.isDropdownOpen
686
+ )
687
+ },
688
+ computedWidth() {
689
+ function removePX(item) {
690
+ return Number(item.replace('px', ''))
691
+ }
692
+
693
+ return this.selectWidth === '100%'
694
+ ? '100%'
695
+ : removePX(this.selectWidth) - removePX(CARET_WIDTH) + 'px'
696
+ },
697
+ getOptionWidth() {
698
+ if (this.optionWidth) return this.optionWidth
699
+
700
+ return this.dropdownWidth
701
+ },
702
+ isSelectDropdownShown() {
703
+ return (
704
+ this.isDropdownOpen &&
705
+ this.dropdownPosition.left !== null &&
706
+ (!this.isSearchable || this.isSearchable)
707
+ )
708
+ },
709
+ isMobileDevice() {
710
+ const userAgent =
711
+ navigator.userAgent || navigator.vendor || window.opera
712
+ const touchCapable =
713
+ 'ontouchstart' in window ||
714
+ navigator.maxTouchPoints > 0 ||
715
+ navigator.msMaxTouchPoints > 0
716
+
717
+ return (
718
+ /Android/i.test(userAgent) ||
719
+ /iPad|iPhone|iPod/.test(userAgent) ||
720
+ (/Macintosh/.test(userAgent) && touchCapable) ||
721
+ /windows phone/i.test(userAgent)
722
+ )
723
+ },
724
+ },
725
+ watch: {
726
+ value(val) {
727
+ this.selectedValue = val
728
+ },
729
+ async isDropdownOpen(val) {
730
+ if (val) {
731
+ this.$emit('on-dropdown-open')
732
+ setTimeout(() => {
733
+ this.isClickOutsideActive = true
734
+ }, 10)
735
+ await this.$nextTick()
736
+ this.handleSetDropdownOffet()
737
+ } else {
738
+ this.dropdownPosition.left = null
739
+ setTimeout(() => {
740
+ this.isClickOutsideActive = false
741
+ }, 10)
742
+ }
743
+ if (val && this.isSearchable) {
744
+ this.$nextTick(() => {
745
+ if (this.$refs.searchInput && !this.isMobileDevice) {
746
+ this.$refs.searchInput.$el.querySelector('input').focus()
747
+ }
748
+ })
749
+ }
750
+ },
751
+ },
752
+ mounted() {
753
+ this.observeDropdownHeight()
754
+ this.observeSelectWidth()
755
+ window.addEventListener('resize', this.handleSetDropdownOffet)
756
+ },
757
+ beforeMount() {
758
+ this.selectedValue = this.value
759
+ document.addEventListener('click', this.clickOutside)
760
+ this.getDropdownPosition()
761
+ window.removeEventListener('resize', this.handleSetDropdownOffet)
762
+ if (this.dropdownResizeObserver) this.dropdownResizeObserver.disconnect()
763
+ if (this.selectResizeObserver) this.selectResizeObserver.disconnect()
764
+ },
765
+ unmounted() {
766
+ document.removeEventListener('click', this.clickOutside)
767
+ },
768
+ methods: {
769
+ focus() {
770
+ this.isActive = true
771
+ },
772
+ blur(e) {
773
+ this.isActive = false
774
+ this.$emit('blur', e)
775
+ },
776
+ toggleDropdown() {
777
+ this.isDropdownOpen = !this.isDropdownOpen
778
+ },
779
+ toggleCaretDropdown() {
780
+ this.isDropdownOpen = !this.isDropdownOpen
781
+ },
782
+ closeDropdown() {
783
+ this.blur()
784
+ this.clearSearch()
785
+ this.isDropdownOpen = false
786
+ },
787
+ clearSearch() {
788
+ this.textSearch = ''
789
+ this.searchChange('')
790
+ },
791
+ optionSelected(e) {
792
+ this.selectedValue = e
793
+ this.closeDropdown()
794
+ this.blur()
795
+ this.$emit('input-change', e)
796
+ },
797
+ optionHovered: debounce(function (e) {
798
+ this.hoveredValue = e
799
+ }, 300),
800
+ mouseEnterHandler() {
801
+ if (this.hoverDropdown) {
802
+ this.focus()
803
+ this.isDropdownOpen = true
804
+ }
805
+ },
806
+ mouseLeaveHandler() {
807
+ if (this.hoverDropdown) {
808
+ this.blur()
809
+ }
810
+ },
811
+ optionLeave() {
812
+ if (this.dropdownAutoClose) {
813
+ this.isDropdownOpen = false
814
+ }
815
+ },
816
+ searchChange(value) {
817
+ this.textSearch = value
818
+ this.$emit('search-change', value)
819
+ const dropdownChildren = [...this.$refs.dropdown.$el.children]
820
+ dropdownChildren.forEach((el) => {
821
+ if (!el.textContent.toLowerCase().includes(value.toLowerCase())) {
822
+ el.style.display = 'none'
823
+
824
+ return
825
+ }
826
+
827
+ el.style.display = 'inherit'
828
+ })
829
+ },
830
+ clickOutside(event) {
831
+ const dropdownRef = this.$refs.dropdown
832
+ // we need to prevent closing on selecting an option, because in the case of
833
+ // a disabled option, we don't want to close the dropdown
834
+ if (!this.isClickOutsideActive) return
835
+ if (
836
+ this.$refs.select.$el == event.target ||
837
+ this.$refs.select.$el.contains(event.target) ||
838
+ event.target.id === 'more-button' ||
839
+ event.target.parentNode === dropdownRef.$el
840
+ ) {
841
+ return
842
+ } else {
843
+ this.closeDropdown()
844
+ }
845
+ },
846
+ onKeyDown(e) {
847
+ if (e.key == 'ArrowDown') {
848
+ this.onArrowPress(1)
849
+ } else if (e.key == 'ArrowUp') {
850
+ this.onArrowPress(-1)
851
+ } else if (e.key == 'Enter') {
852
+ const optionHoveredComponent = [...this.$refs.dropdown.$el.children][
853
+ (this.hoveredIndex - 1 + this.optionLength) % this.optionLength
854
+ ]
855
+ this.optionSelected(optionHoveredComponent.$el.dataset.value)
856
+ }
857
+ },
858
+ // If some part of the dropdown menu is outside viewport of the bottom of the screen,
859
+ // we need to offset it and display it at the top of the select dropdown instead
860
+ async getDropdownPosition() {
861
+ if (
862
+ !this.$refs.dropdownWrapperRef ||
863
+ !this.$refs.select ||
864
+ !this.$refs.dropdown
865
+ ) {
866
+ return
867
+ }
868
+ await this.$nextTick()
869
+ const isDisplayedAtBottom = await this.generateDropdownPosition()
870
+ // If the dropdown menu is going to be displayed at the bottom,
871
+ // we need reverify its position after a dom update (nextTick)
872
+ await this.$nextTick()
873
+ if (isDisplayedAtBottom) this.generateDropdownPosition()
874
+ },
875
+ async generateDropdownPosition() {
876
+ const isDropdownNotCompletelyVisible =
877
+ await this.isBottomOfDropdownOutOfViewport()
878
+ const dropdownWrapperEl = this.$refs.dropdownWrapperRef.$el
879
+ const selectButtonHeight = this.$refs.select.$el.clientHeight
880
+ const dropdownHeight = this.$refs.dropdown.$el.clientHeight
881
+ const dropdownWrapperRelativeHeight =
882
+ dropdownWrapperEl.getBoundingClientRect().top +
883
+ window.scrollY +
884
+ DROPDOWN_HEIGHT_OFFSET
885
+
886
+ const top =
887
+ isDropdownNotCompletelyVisible ||
888
+ (!isDropdownNotCompletelyVisible &&
889
+ this.dropdownMenuPosition === DROPDOWN_MENU_POSITIONS.Bottom)
890
+ ? dropdownWrapperRelativeHeight
891
+ : dropdownWrapperRelativeHeight -
892
+ dropdownHeight -
893
+ selectButtonHeight -
894
+ DROPDOWN_TOP_OFFSET
895
+ const left = this.dropdownPosition.left
896
+ ? this.dropdownPosition.left
897
+ : dropdownWrapperEl.getBoundingClientRect().left + window.scrollX
898
+
899
+ this.dropdownPosition = { left: Math.floor(left), top: Math.floor(top) }
900
+
901
+ return isDropdownNotCompletelyVisible
902
+ },
903
+ async isBottomOfDropdownOutOfViewport() {
904
+ if (
905
+ !this.$refs.dropdown ||
906
+ this.dropdownMenuPosition === DROPDOWN_MENU_POSITIONS.Bottom
907
+ ) {
908
+ return false
909
+ }
910
+
911
+ await this.$nextTick()
912
+ const rect = this.$refs.dropdown.$el.getBoundingClientRect()
913
+ const windowHeight =
914
+ window.innerHeight || document.documentElement.clientHeight
915
+
916
+ if (windowHeight <= 650) return true
917
+
918
+ // using Math.floor because the offsets may contain decimals we are not going to consider here
919
+ return Math.floor(rect.top) + Math.floor(rect.height) <= windowHeight
920
+ },
921
+ observeDropdownHeight() {
922
+ if (!this.$refs.dropdown) return
923
+ this.dropdownResizeObserver = new ResizeObserver(() => {
924
+ this.$nextTick(() => this.getDropdownPosition())
925
+ })
926
+ this.dropdownResizeObserver.observe(this.$refs.dropdown.$el)
927
+ },
928
+ handleSetDropdownOffet() {
929
+ if (!this.$refs.select) return
930
+ this.dropdownPosition.left = Math.floor(
931
+ this.$refs.select.$el.getBoundingClientRect().left
932
+ )
933
+ this.getDropdownWidth()
934
+ },
935
+ observeSelectWidth() {
936
+ if (!this.$refs.select) return
937
+ this.selectResizeObserver = new ResizeObserver(() =>
938
+ // eslint-disable-next-line vue/valid-next-tick
939
+ this.$nextTick(() => this.getDropdownWidth())
940
+ )
941
+ this.selectResizeObserver.observe(this.$refs.dropdown.$el)
942
+ },
943
+ async getDropdownWidth() {
944
+ if (!this.$refs.select) return
945
+ await this.$nextTick()
946
+ this.dropdownWidth = `${this.$refs.select.$el.clientWidth}px`
947
+ },
948
+ onArrowPress(dir) {
949
+ let newHoveredElem
950
+ const currentHoveredElem = this.$refs.dropdown.$el.querySelector(
951
+ `[data-value="${this.hoveredValue}"]`
952
+ )
953
+ if (currentHoveredElem) {
954
+ if (dir > 0) {
955
+ newHoveredElem = currentHoveredElem.nextElementSibling
956
+ } else {
957
+ newHoveredElem = currentHoveredElem.previousElementSibling
958
+ }
959
+ if (newHoveredElem) {
960
+ this.hoveredValue = newHoveredElem.getAttribute('data-value')
961
+ const topPos = newHoveredElem.offsetTop
962
+ this.$refs.dropdown.$el.scrollTop = topPos
963
+ }
964
+ }
965
+ },
966
+ },
967
+ }
968
+ </script>