@eturnity/eturnity_reusable_components 7.51.10 → 7.51.11-EPDM-12810.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 (386) hide show
  1. package/README.md +29 -29
  2. package/package.json +84 -84
  3. package/src/App.vue +30 -30
  4. package/src/Test.vue +128 -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 +3 -0
  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/clear_formatting.svg +7 -7
  66. package/src/assets/svgIcons/clickable_info.svg +4 -4
  67. package/src/assets/svgIcons/clip.svg +3 -3
  68. package/src/assets/svgIcons/clock.svg +17 -17
  69. package/src/assets/svgIcons/clock_full.svg +3 -3
  70. package/src/assets/svgIcons/close_for_modals,_tool_tips.svg +4 -4
  71. package/src/assets/svgIcons/co_branding.svg +5 -5
  72. package/src/assets/svgIcons/collapse.svg +4 -4
  73. package/src/assets/svgIcons/collapse_all.svg +3 -3
  74. package/src/assets/svgIcons/collections.svg +3 -3
  75. package/src/assets/svgIcons/component_library.svg +7 -7
  76. package/src/assets/svgIcons/consumption_tariffs.svg +43 -43
  77. package/src/assets/svgIcons/context_menu-1.svg +6 -6
  78. package/src/assets/svgIcons/context_menu-2.svg +5 -5
  79. package/src/assets/svgIcons/context_menu.svg +5 -5
  80. package/src/assets/svgIcons/context_menu_tabs.svg +5 -5
  81. package/src/assets/svgIcons/cross.svg +4 -4
  82. package/src/assets/svgIcons/current_variant.svg +4 -4
  83. package/src/assets/svgIcons/dashboard.svg +3 -3
  84. package/src/assets/svgIcons/data_transfer.svg +3 -3
  85. package/src/assets/svgIcons/deadline.svg +4 -4
  86. package/src/assets/svgIcons/deal_flow.svg +5 -5
  87. package/src/assets/svgIcons/delete.svg +4 -4
  88. package/src/assets/svgIcons/delete_area_active.svg +16 -16
  89. package/src/assets/svgIcons/delete_area_inactive.svg +15 -15
  90. package/src/assets/svgIcons/direction_active-1.svg +12 -12
  91. package/src/assets/svgIcons/direction_active.svg +5 -5
  92. package/src/assets/svgIcons/direction_arrow.svg +4 -4
  93. package/src/assets/svgIcons/direction_inactive.svg +4 -4
  94. package/src/assets/svgIcons/dislike.svg +3 -3
  95. package/src/assets/svgIcons/distance_tool.svg +8 -8
  96. package/src/assets/svgIcons/distances_active.svg +9 -9
  97. package/src/assets/svgIcons/distances_inactive.svg +8 -8
  98. package/src/assets/svgIcons/distort_tool.svg +10 -10
  99. package/src/assets/svgIcons/distort_tool2.svg +16 -16
  100. package/src/assets/svgIcons/document.svg +3 -3
  101. package/src/assets/svgIcons/documents.svg +4 -4
  102. package/src/assets/svgIcons/downarrow.svg +3 -3
  103. package/src/assets/svgIcons/download.svg +4 -4
  104. package/src/assets/svgIcons/drag_icon.svg +8 -8
  105. package/src/assets/svgIcons/draggable_corner.svg +5 -5
  106. package/src/assets/svgIcons/draw_tool.svg +3 -3
  107. package/src/assets/svgIcons/duplicate-1.svg +8 -8
  108. package/src/assets/svgIcons/duplicate-2.svg +5 -5
  109. package/src/assets/svgIcons/duplicate.svg +4 -4
  110. package/src/assets/svgIcons/e-mobility_configurator.svg +6 -6
  111. package/src/assets/svgIcons/e_signature.svg +5 -5
  112. package/src/assets/svgIcons/edit_button.svg +3 -3
  113. package/src/assets/svgIcons/electricity_tariff.svg +3 -3
  114. package/src/assets/svgIcons/email.svg +3 -3
  115. package/src/assets/svgIcons/ems-1.svg +3 -3
  116. package/src/assets/svgIcons/ems.svg +3 -3
  117. package/src/assets/svgIcons/end_of_the_list.svg +5 -5
  118. package/src/assets/svgIcons/erase.svg +4 -4
  119. package/src/assets/svgIcons/expand_all.svg +4 -4
  120. package/src/assets/svgIcons/export_document.svg +3 -3
  121. package/src/assets/svgIcons/external_icon.svg +5 -5
  122. package/src/assets/svgIcons/fav_icon.svg +4 -4
  123. package/src/assets/svgIcons/finance.svg +3 -3
  124. package/src/assets/svgIcons/financing_for_pv-1.svg +5 -5
  125. package/src/assets/svgIcons/financing_for_pv-2.svg +3 -3
  126. package/src/assets/svgIcons/financing_for_pv.svg +6 -6
  127. package/src/assets/svgIcons/finish-1.svg +4 -4
  128. package/src/assets/svgIcons/finish.svg +3 -3
  129. package/src/assets/svgIcons/flatten.svg +11 -11
  130. package/src/assets/svgIcons/flatten_roof.svg +20 -20
  131. package/src/assets/svgIcons/folder.svg +3 -3
  132. package/src/assets/svgIcons/free_technology.svg +5 -5
  133. package/src/assets/svgIcons/handle.svg +5 -5
  134. package/src/assets/svgIcons/heat_calc.svg +7 -7
  135. package/src/assets/svgIcons/height_equalize.svg +3 -3
  136. package/src/assets/svgIcons/height_snap.svg +3 -3
  137. package/src/assets/svgIcons/house.svg +3 -3
  138. package/src/assets/svgIcons/house_3d-1.svg +7 -7
  139. package/src/assets/svgIcons/house_3d.svg +7 -7
  140. package/src/assets/svgIcons/hybrid.svg +4 -4
  141. package/src/assets/svgIcons/inclination.svg +2 -2
  142. package/src/assets/svgIcons/info.svg +3 -3
  143. package/src/assets/svgIcons/initial_situation.svg +3 -3
  144. package/src/assets/svgIcons/integrations.svg +3 -3
  145. package/src/assets/svgIcons/intro-tour-1.svg +3 -3
  146. package/src/assets/svgIcons/intro-tour.svg +3 -3
  147. package/src/assets/svgIcons/inverter-1.svg +5 -5
  148. package/src/assets/svgIcons/inverter.svg +3 -3
  149. package/src/assets/svgIcons/italic.svg +3 -3
  150. package/src/assets/svgIcons/key.svg +3 -3
  151. package/src/assets/svgIcons/lake.svg +29 -29
  152. package/src/assets/svgIcons/layers_close.svg +4 -4
  153. package/src/assets/svgIcons/layers_open.svg +4 -4
  154. package/src/assets/svgIcons/lead_marketplace.svg +6 -6
  155. package/src/assets/svgIcons/lead_provider.svg +4 -4
  156. package/src/assets/svgIcons/length_2d.svg +2 -2
  157. package/src/assets/svgIcons/length_3d.svg +4 -4
  158. package/src/assets/svgIcons/length_calculator.svg +2 -2
  159. package/src/assets/svgIcons/length_in_2d_active.svg +12 -12
  160. package/src/assets/svgIcons/length_in_2d_inctive.svg +13 -13
  161. package/src/assets/svgIcons/light_bulb.svg +3 -3
  162. package/src/assets/svgIcons/like.svg +3 -3
  163. package/src/assets/svgIcons/line_graph.svg +3 -3
  164. package/src/assets/svgIcons/local_subsidies.svg +18 -18
  165. package/src/assets/svgIcons/location.svg +3 -3
  166. package/src/assets/svgIcons/lock.svg +3 -3
  167. package/src/assets/svgIcons/logout.svg +3 -3
  168. package/src/assets/svgIcons/loop.svg +3 -3
  169. package/src/assets/svgIcons/low-vegetation.svg +37 -37
  170. package/src/assets/svgIcons/lunch.svg +4 -4
  171. package/src/assets/svgIcons/magic_tool.svg +6 -6
  172. package/src/assets/svgIcons/map_icon.svg +5 -5
  173. package/src/assets/svgIcons/map_settings.svg +3 -3
  174. package/src/assets/svgIcons/margin_tool.svg +4 -4
  175. package/src/assets/svgIcons/meeting.svg +6 -6
  176. package/src/assets/svgIcons/module.svg +3 -3
  177. package/src/assets/svgIcons/move_copy.svg +4 -4
  178. package/src/assets/svgIcons/move_down.svg +3 -3
  179. package/src/assets/svgIcons/move_up.svg +3 -3
  180. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  181. package/src/assets/svgIcons/next.svg +4 -4
  182. package/src/assets/svgIcons/normal-tg.svg +30 -30
  183. package/src/assets/svgIcons/normal-vegetation.svg +53 -53
  184. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  185. package/src/assets/svgIcons/numbered_list.svg +6 -6
  186. package/src/assets/svgIcons/obstacle_tool.svg +8 -8
  187. package/src/assets/svgIcons/obstacle_tool_origin.svg +3 -3
  188. package/src/assets/svgIcons/offset_tool.svg +8 -8
  189. package/src/assets/svgIcons/open-tg.svg +21 -21
  190. package/src/assets/svgIcons/optimizer.svg +6 -6
  191. package/src/assets/svgIcons/outline_tool.svg +11 -11
  192. package/src/assets/svgIcons/pan_tool.svg +12 -12
  193. package/src/assets/svgIcons/panels_tool.svg +8 -8
  194. package/src/assets/svgIcons/pen_tool.svg +4 -4
  195. package/src/assets/svgIcons/picker_tool.svg +4 -4
  196. package/src/assets/svgIcons/picture.svg +3 -3
  197. package/src/assets/svgIcons/pin.svg +5 -5
  198. package/src/assets/svgIcons/presentation.svg +3 -3
  199. package/src/assets/svgIcons/previous.svg +4 -4
  200. package/src/assets/svgIcons/profile-1.svg +4 -4
  201. package/src/assets/svgIcons/profile.svg +4 -4
  202. package/src/assets/svgIcons/profitability.svg +3 -3
  203. package/src/assets/svgIcons/project_analysis.svg +4 -4
  204. package/src/assets/svgIcons/project_settings.svg +4 -4
  205. package/src/assets/svgIcons/protected-tg.svg +47 -47
  206. package/src/assets/svgIcons/pv.svg +3 -3
  207. package/src/assets/svgIcons/quotations.svg +6 -6
  208. package/src/assets/svgIcons/redo.svg +6 -6
  209. package/src/assets/svgIcons/resizer.svg +5 -5
  210. package/src/assets/svgIcons/roof_layer.svg +3 -3
  211. package/src/assets/svgIcons/rotate_tool.svg +3 -3
  212. package/src/assets/svgIcons/rotate_view.svg +5 -5
  213. package/src/assets/svgIcons/ruler_tool.svg +3 -3
  214. package/src/assets/svgIcons/run_simulation.svg +3 -3
  215. package/src/assets/svgIcons/save.svg +3 -3
  216. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  217. package/src/assets/svgIcons/sea.svg +34 -34
  218. package/src/assets/svgIcons/search.svg +3 -3
  219. package/src/assets/svgIcons/security.svg +3 -3
  220. package/src/assets/svgIcons/settings.svg +3 -3
  221. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  222. package/src/assets/svgIcons/smartphone.svg +4 -4
  223. package/src/assets/svgIcons/solar_calc.svg +13 -13
  224. package/src/assets/svgIcons/sorting.svg +4 -4
  225. package/src/assets/svgIcons/split.svg +12 -12
  226. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  227. package/src/assets/svgIcons/strikethrough.svg +4 -4
  228. package/src/assets/svgIcons/string_design.svg +5 -5
  229. package/src/assets/svgIcons/string_directions.svg +10 -10
  230. package/src/assets/svgIcons/subscriptions.svg +3 -3
  231. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  232. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  233. package/src/assets/svgIcons/subsidies.svg +3 -3
  234. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  235. package/src/assets/svgIcons/suitcase.svg +3 -3
  236. package/src/assets/svgIcons/summer.svg +3 -3
  237. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  238. package/src/assets/svgIcons/transfer.svg +4 -4
  239. package/src/assets/svgIcons/trim_tool.svg +4 -4
  240. package/src/assets/svgIcons/truck.svg +3 -3
  241. package/src/assets/svgIcons/underlined.svg +3 -3
  242. package/src/assets/svgIcons/undo.svg +6 -6
  243. package/src/assets/svgIcons/uparrow.svg +3 -3
  244. package/src/assets/svgIcons/update.svg +3 -3
  245. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  246. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  247. package/src/assets/svgIcons/upload_image.svg +8 -8
  248. package/src/assets/svgIcons/upload_image_tool.svg +7 -7
  249. package/src/assets/svgIcons/variants.svg +6 -6
  250. package/src/assets/svgIcons/vertical_tool.svg +3 -3
  251. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  252. package/src/assets/svgIcons/warning.svg +4 -4
  253. package/src/assets/svgIcons/way.svg +5 -5
  254. package/src/assets/svgIcons/wifi.svg +3 -3
  255. package/src/assets/svgIcons/winter.svg +3 -3
  256. package/src/assets/svgIcons/workflow_template.svg +11 -11
  257. package/src/assets/tests/__mocks__/iconCache.js +1 -1
  258. package/src/assets/tests/__mocks__/svgMock.js +1 -1
  259. package/src/assets/tests/helpers.js +12 -12
  260. package/src/assets/theme.js +44 -44
  261. package/src/components/addNewButton/AddNewButton.stories.js +17 -17
  262. package/src/components/addNewButton/addNewButton.spec.js +23 -23
  263. package/src/components/addNewButton/index.vue +62 -62
  264. package/src/components/banner/actionBanner/ActionBanner.stories.js +45 -45
  265. package/src/components/banner/actionBanner/actionBanner.spec.js +76 -76
  266. package/src/components/banner/actionBanner/index.vue +86 -86
  267. package/src/components/banner/banner/Banner.stories.js +64 -64
  268. package/src/components/banner/banner/banner.spec.js +149 -149
  269. package/src/components/banner/banner/index.vue +205 -205
  270. package/src/components/banner/infoBanner/InfoBanner.spec.js +70 -70
  271. package/src/components/banner/infoBanner/InfoBanner.stories.js +42 -42
  272. package/src/components/banner/infoBanner/index.vue +97 -97
  273. package/src/components/banner/notificationBanner/index.vue +131 -131
  274. package/src/components/buttons/buttonIcon/index.vue +147 -147
  275. package/src/components/buttons/closeButton/CloseButton.stories.js +25 -25
  276. package/src/components/buttons/closeButton/index.vue +62 -62
  277. package/src/components/buttons/mainButton/MainButton.stories.js +51 -51
  278. package/src/components/buttons/mainButton/index.vue +169 -169
  279. package/src/components/buttons/mainButton/mainButton.spec.js +35 -35
  280. package/src/components/card/Card.stories.js +79 -79
  281. package/src/components/card/card.spec.js +135 -135
  282. package/src/components/card/index.vue +116 -116
  283. package/src/components/collapsableInfoText/index.vue +127 -127
  284. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  285. package/src/components/deleteIcon/index.vue +78 -78
  286. package/src/components/draggableInputHandle/index.vue +46 -46
  287. package/src/components/dropdown/Dropdown.stories.js +53 -53
  288. package/src/components/dropdown/index.vue +138 -138
  289. package/src/components/errorMessage/index.vue +64 -64
  290. package/src/components/filter/filterSettings.vue +669 -669
  291. package/src/components/filter/index.vue +154 -154
  292. package/src/components/filter/parentDropdown.vue +91 -91
  293. package/src/components/icon/Icons.stories.js +31 -31
  294. package/src/components/icon/icon.spec.js +66 -66
  295. package/src/components/icon/iconCache.mjs +23 -23
  296. package/src/components/icon/iconCollection.vue +83 -83
  297. package/src/components/icon/index.vue +151 -151
  298. package/src/components/iconWrapper/index.vue +179 -179
  299. package/src/components/infoCard/InfoCard.stories.js +144 -144
  300. package/src/components/infoCard/defaultProps.js +7 -7
  301. package/src/components/infoCard/index.vue +140 -140
  302. package/src/components/infoCard/infoCard.spec.js +56 -56
  303. package/src/components/infoText/index.vue +382 -379
  304. package/src/components/infoText/placeholder.vue +225 -225
  305. package/src/components/inputs/checkbox/Checkbox.stories.js +63 -63
  306. package/src/components/inputs/checkbox/checkbox.spec.js +109 -109
  307. package/src/components/inputs/checkbox/index.vue +236 -236
  308. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  309. package/src/components/inputs/inputNumber/index.vue +979 -979
  310. package/src/components/inputs/inputNumberQuestion/index.vue +218 -218
  311. package/src/components/inputs/inputText/InputText.stories.js +70 -70
  312. package/src/components/inputs/inputText/index.vue +438 -438
  313. package/src/components/inputs/inputText/inputText.spec.js +588 -588
  314. package/src/components/inputs/radioButton/RadioButton.stories.js +77 -77
  315. package/src/components/inputs/radioButton/defaultProps.js +31 -31
  316. package/src/components/inputs/radioButton/index.vue +330 -330
  317. package/src/components/inputs/radioButton/radioButton.spec.js +306 -306
  318. package/src/components/inputs/searchInput/SearchInput.stories.js +66 -66
  319. package/src/components/inputs/searchInput/defaultProps.js +12 -12
  320. package/src/components/inputs/searchInput/index.vue +159 -159
  321. package/src/components/inputs/searchInput/searchInput.spec.js +64 -64
  322. package/src/components/inputs/select/index.vue +962 -962
  323. package/src/components/inputs/select/option/index.vue +165 -165
  324. package/src/components/inputs/select/select.stories.js +58 -58
  325. package/src/components/inputs/slider/index.vue +126 -126
  326. package/src/components/inputs/switchField/index.vue +254 -254
  327. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  328. package/src/components/inputs/textAreaInput/index.vue +198 -198
  329. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  330. package/src/components/inputs/toggle/index.vue +317 -317
  331. package/src/components/inputs/toggle/toggle.spec.js +102 -102
  332. package/src/components/label/index.vue +99 -99
  333. package/src/components/markerItem/index.vue +95 -95
  334. package/src/components/modals/actionModal/index.vue +64 -64
  335. package/src/components/modals/infoModal/index.vue +52 -52
  336. package/src/components/modals/modal/index.vue +196 -196
  337. package/src/components/modals/modal/modal.stories.js +31 -31
  338. package/src/components/navigationTabs/index.vue +114 -114
  339. package/src/components/pageSubtitle/PageSubtitle.stories.js +59 -59
  340. package/src/components/pageSubtitle/index.vue +78 -78
  341. package/src/components/pageSubtitle/pageSubtitle.spec.js +46 -46
  342. package/src/components/pageTitle/PageTitle.stories.js +95 -95
  343. package/src/components/pageTitle/index.vue +91 -91
  344. package/src/components/pageTitle/pageTitle.spec.js +46 -46
  345. package/src/components/pagination/index.vue +148 -148
  346. package/src/components/progressBar/index.vue +125 -125
  347. package/src/components/projectMarker/index.vue +300 -300
  348. package/src/components/rangeSlider/Slider.vue +573 -573
  349. package/src/components/rangeSlider/index.vue +517 -517
  350. package/src/components/rangeSlider/utils/dom.js +49 -49
  351. package/src/components/rangeSlider/utils/fns.js +26 -26
  352. package/src/components/roundTabs/index.vue +107 -107
  353. package/src/components/selectedOptions/index.vue +471 -471
  354. package/src/components/selectedOptions/selectedOptions.spec.js +176 -176
  355. package/src/components/selectedOptions/selectedOptions.stories.js +155 -155
  356. package/src/components/sideMenu/index.vue +270 -270
  357. package/src/components/spinner/Spinner.stories.js +34 -34
  358. package/src/components/spinner/index.vue +96 -96
  359. package/src/components/spinner/spinner.spec.js +69 -69
  360. package/src/components/spinnerGif/index.vue +98 -98
  361. package/src/components/stringDesign/DropdownMenu/index.vue +983 -983
  362. package/src/components/tableDropdown/index.vue +639 -639
  363. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  364. package/src/components/tables/mainTable/index.vue +518 -518
  365. package/src/components/tables/viewTable/index.vue +195 -195
  366. package/src/components/tabsHeader/index.vue +83 -83
  367. package/src/components/threeDots/index.vue +413 -413
  368. package/src/components/videoThumbnail/index.vue +103 -103
  369. package/src/components/videoThumbnail/videoThumbnail.stories.js +33 -33
  370. package/src/helpers/currencyMapping.js +28 -28
  371. package/src/helpers/numberConverter.js +103 -103
  372. package/src/helpers/translateLang.js +128 -128
  373. package/src/main.js +7 -7
  374. package/src/mixins/inputValidations.js +97 -97
  375. package/src/router/dynamicRoutes.js +23 -23
  376. package/src/stories/Button.stories.js +48 -48
  377. package/src/stories/Button.vue +52 -52
  378. package/src/stories/Configure.mdx +364 -364
  379. package/src/stories/Header.stories.js +41 -41
  380. package/src/stories/Header.vue +59 -59
  381. package/src/stories/Page.stories.js +30 -30
  382. package/src/stories/Page.vue +83 -83
  383. package/src/stories/button.css +30 -30
  384. package/src/stories/header.css +32 -32
  385. package/src/stories/page.css +69 -69
  386. package/src/utils/index.js +12 -12
@@ -1,979 +1,979 @@
1
- <template>
2
- <Container :align-items="alignItems" :input-width="inputWidth">
3
- <LabelSlotWrapper
4
- v-if="hasLabelSlot"
5
- :align-items="alignItems"
6
- :border-color="borderColor"
7
- :is-error="isError"
8
- :is-interactive="isInteractive"
9
- :no-border="noBorder"
10
- @mousedown="initInteraction"
11
- >
12
- <slot name="label"></slot>
13
- </LabelSlotWrapper>
14
-
15
- <LabelWrapper v-if="labelText">
16
- <LabelText
17
- :data-id="labelDataId"
18
- :label-font-color="labelFontColor"
19
- :label-font-weight="labelFontWeight"
20
- >
21
- {{ labelText }}
22
- </LabelText>
23
-
24
- <InfoText
25
- v-if="labelInfoText"
26
- :align-arrow="labelInfoAlign"
27
- :text="labelInfoText"
28
- />
29
- </LabelWrapper>
30
- <InputWrapper>
31
- <InputContainer
32
- v-bind="$attrs"
33
- ref="inputField1"
34
- :align-items="alignItems"
35
- :background-color="
36
- colorMode === 'transparent' ? 'transparent' : backgroundColor
37
- "
38
- :border-color="
39
- colorMode === 'transparent' && !borderColor ? 'white' : borderColor
40
- "
41
- :color-mode="colorMode"
42
- :data-id="inputDataId"
43
- :disabled="disabled"
44
- :font-color="colorMode === 'transparent' ? 'white' : fontColor"
45
- :font-size="fontSize"
46
- :has-label-slot="hasLabelSlot"
47
- :has-slot="hasSlot"
48
- :has-unit="unitName && !!unitName.length"
49
- :input-height="inputHeight"
50
- :is-disabled="disabled"
51
- :is-error="isError"
52
- :is-interactive="isInteractive"
53
- :min-width="minWidth"
54
- :no-border="noBorder"
55
- :placeholder="displayedPlaceholder"
56
- :show-arrow-controls="showArrowControls"
57
- :show-linear-unit-name="showLinearUnitName"
58
- :slot-size="slotSize"
59
- :text-align="textAlign"
60
- :value="formatWithCurrency(value)"
61
- @blur="onInputBlur($event)"
62
- @focus="focusInput()"
63
- @input="onInput($event)"
64
- @keydown.down="decrementValue"
65
- @keydown.up="incrementValue"
66
- @keyup.enter="onEnterPress"
67
- />
68
- <SlotContainer v-if="hasSlot" :is-error="isError" :slot-size="slotSize">
69
- <slot></slot>
70
- </SlotContainer>
71
-
72
- <UnitContainer
73
- v-if="unitName && showLinearUnitName && !hasSlot"
74
- :has-length="!!textInput.length"
75
- :is-error="isError"
76
- >{{ unitName }}</UnitContainer
77
- >
78
- <IconWrapper
79
- v-if="isError && !showLinearUnitName"
80
- :margin-right="showSelect ? selectWidth : 0"
81
- size="16px"
82
- >
83
- <Icon cursor="default" name="warning" size="16px" />
84
- </IconWrapper>
85
- <SelectWrapper v-if="showSelect">
86
- <Divider />
87
- <RCSelect
88
- :disabled="isSelectDisabled"
89
- :select-width="`${selectWidth}px`"
90
- :show-border="false"
91
- @input-change="$emit('select-change', $event)"
92
- >
93
- <template #selector>
94
- <SelectText>{{ getSelectValue }}</SelectText>
95
- </template>
96
- <template #dropdown>
97
- <RCOption
98
- v-for="item in selectOptions"
99
- :key="item.value"
100
- :value="item.value"
101
- >
102
- {{ item.label }}
103
- </RCOption>
104
- </template>
105
- </RCSelect>
106
- </SelectWrapper>
107
-
108
- <ArrowControls
109
- v-if="!disabled && showArrowControls"
110
- :color-mode="colorMode"
111
- >
112
- <ArrowButton @click="incrementValue">
113
- <Icon
114
- :color="colorMode === 'transparent' ? 'white' : undefined"
115
- name="arrow_up"
116
- size="8px"
117
- />
118
- </ArrowButton>
119
- <ArrowDivider :color-mode="colorMode" />
120
- <ArrowButton
121
- :is-disabled="textInput <= minNumber"
122
- @click="decrementValue"
123
- >
124
- <Icon
125
- :color="colorMode === 'transparent' ? 'white' : undefined"
126
- :disabled="textInput <= minNumber"
127
- name="arrow_down"
128
- size="8px"
129
- />
130
- </ArrowButton>
131
- </ArrowControls>
132
- </InputWrapper>
133
- <ErrorMessage v-if="isError">{{ errorMessage }}</ErrorMessage>
134
- </Container>
135
- </template>
136
-
137
- <script>
138
- // import InputNumber from "@eturnity/eturnity_reusable_components/src/components/inputs/inputNumber"
139
- //This component should be used for questions with input fields only
140
- //How to use:
141
- // <input-number
142
- // placeholder="Enter distance"
143
- // :isError="false" //default is false
144
- // inputWidth="150px" //by default, this is 100%
145
- // minWidth="100px"
146
- // :numberPrecision="3"
147
- // minDecimals="2"
148
- // unitName="pc"
149
- // :value="inputValue" //required -- String
150
- // @input-change="onInputChange($event)" //required
151
- // @on-enter-click="onInputSubmit()"
152
- // :errorMessage="Enter a number between 1 and 10"
153
- // :disabled="false"
154
- // :noBorder="true"
155
- // textAlign="left" // "left, right, center"
156
- // :showLinearUnitName="true"
157
- // fontSize="13px"
158
- // labelText="Number of Modules"
159
- // labelInfoText="Here is some information for you..."
160
- // labelInfoAlign="left"
161
- // :minNumber="0"
162
- // fontColor="blue"
163
- // colorMode="transparent" // Makes background transparent, border white, and font white
164
- // >
165
- //<template name=label><img>....</template>
166
- //</inputNumber>
167
- import styled from 'vue3-styled-components'
168
- import {
169
- stringToNumber,
170
- numberToString,
171
- } from '../../../helpers/numberConverter'
172
- import InfoText from '../../infoText'
173
- import ErrorMessage from '../../errorMessage'
174
- import RCSelect from '../select'
175
- import RCOption from '../select/option'
176
- import warningIcon from '../../../assets/icons/error_icon.png'
177
- import Icon from '../../icon'
178
-
179
- const inputProps = {
180
- isError: Boolean,
181
- hasUnit: Boolean,
182
- inputWidth: String,
183
- minWidth: String,
184
- isDisabled: Boolean,
185
- noBorder: Boolean,
186
- textAlign: String,
187
- fontSize: String,
188
- fontColor: String,
189
- backgroundColor: String,
190
- hasSlot: Boolean,
191
- hasLabelSlot: Boolean,
192
- slotSize: String,
193
- inputHeight: String,
194
- isInteractive: Boolean,
195
- alignItems: String,
196
- labelFontColor: String,
197
- labelFontWeight: String,
198
- borderColor: String,
199
- showLinearUnitName: Boolean,
200
- colorMode: String,
201
- showArrowControls: Boolean,
202
- }
203
-
204
- const Container = styled('div', inputProps)`
205
- width: ${(props) => (props.inputWidth ? props.inputWidth : '100%')};
206
- position: relative;
207
- display: grid;
208
- grid-template-columns: ${(props) =>
209
- props.alignItems === 'vertical' ? '1fr' : 'auto 1fr'};
210
- `
211
-
212
- const InputContainer = styled('input', inputProps)`
213
- border: ${(props) =>
214
- props.isError
215
- ? '1px solid ' + props.theme.colors.red
216
- : props.noBorder
217
- ? 'none'
218
- : props.borderColor
219
- ? props.theme.colors[props.borderColor]
220
- ? '1px solid ' + props.theme.colors[props.borderColor]
221
- : '1px solid ' + props.borderColor
222
- : '1px solid ' + props.theme.colors.grey4};
223
- height: ${(props) => props.inputHeight};
224
- max-height: ${(props) => props.inputHeight};
225
- padding: ${({ colorMode }) =>
226
- colorMode === 'transparent' ? '10px 15px' : '0 10px'};
227
- padding-right: ${({
228
- slotSize,
229
- isError,
230
- showLinearUnitName,
231
- colorMode,
232
- showArrowControls,
233
- }) =>
234
- showArrowControls
235
- ? '40px'
236
- : colorMode === 'transparent'
237
- ? '0'
238
- : slotSize
239
- ? isError && !showLinearUnitName
240
- ? 'calc(' + slotSize + ' + 24px)'
241
- : 'calc(' + slotSize + ' + 10px)'
242
- : isError && !showLinearUnitName
243
- ? '24px'
244
- : '5px'};
245
- border-radius: ${(props) =>
246
- props.isInteractive && props.alignItems != 'vertical'
247
- ? '0 4px 4px 0'
248
- : '4px'};
249
- text-align: ${(props) => props.textAlign};
250
- cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'auto')};
251
- font-size: ${(props) => (props.fontSize ? props.fontSize : '13px')};
252
- color: ${(props) =>
253
- props.isError
254
- ? props.theme.colors.grey6
255
- : props.isDisabled
256
- ? props.colorMode === 'transparent'
257
- ? props.theme.colors.white
258
- : props.theme.colors.grey2
259
- : props.fontColor
260
- ? props.fontColor + ' !important'
261
- : props.theme.colors.black};
262
- background-color: ${(props) =>
263
- props.isDisabled
264
- ? props.colorMode === 'transparent'
265
- ? 'transparent'
266
- : props.theme.colors.grey5
267
- : props.backgroundColor
268
- ? props.backgroundColor + ' !important'
269
- : props.theme.colors.white};
270
- width: ${(props) =>
271
- props.inputWidth && !props.hasLabelSlot ? props.inputWidth : '100%'};
272
- min-width: ${(props) => (props.minWidth ? props.minWidth : 'unset')};
273
- box-sizing: border-box;
274
- opacity: ${(props) =>
275
- props.isDisabled && props.colorMode === 'transparent' ? '0.4' : '1'};
276
-
277
- &::placeholder {
278
- color: ${(props) => props.theme.colors.grey2};
279
- }
280
-
281
- &:focus {
282
- outline: none;
283
- }
284
- `
285
-
286
- const ArrowControlsProps = {
287
- colorMode: String,
288
- }
289
- const ArrowControls = styled('div', ArrowControlsProps)`
290
- position: absolute;
291
- right: 0;
292
- top: 0;
293
- bottom: 0;
294
- display: grid;
295
- grid-template-rows: 1fr auto 1fr;
296
- align-items: center;
297
- justify-items: center;
298
- cursor: pointer;
299
- width: 30px;
300
- background-color: ${(props) =>
301
- props.colorMode === 'transparent'
302
- ? 'transparent'
303
- : props.theme.colors.white};
304
- border-left: 1px solid
305
- ${(props) =>
306
- props.colorMode === 'transparent'
307
- ? props.theme.colors.white
308
- : props.theme.colors.black};
309
- `
310
-
311
- const ArrowButtonProps = {
312
- isDisabled: Boolean,
313
- }
314
- const ArrowButton = styled('button', ArrowButtonProps)`
315
- background: transparent;
316
- opacity: ${(props) => (props.isDisabled ? '0.2' : '1')};
317
- cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'pointer')};
318
- display: flex;
319
- align-items: center;
320
- justify-content: center;
321
- padding: 0;
322
- width: 100%;
323
- height: 100%;
324
- `
325
-
326
- const ArrowDivider = styled('div', ArrowControlsProps)`
327
- width: 100%;
328
- height: 1px;
329
- background-color: ${(props) =>
330
- props.colorMode === 'transparent'
331
- ? props.theme.colors.white
332
- : props.theme.colors.black};
333
- `
334
-
335
- const InputWrapper = styled.span`
336
- position: relative;
337
- `
338
-
339
- const UnitContainer = styled('span', inputProps)`
340
- border-left: 1px solid
341
- ${(props) =>
342
- props.isError
343
- ? props.theme.colors.red
344
- : props.hasLength
345
- ? props.theme.colors.black
346
- : props.theme.colors.mediumGray};
347
- position: absolute;
348
- right: 10px;
349
- top: 10px;
350
- padding-left: 10px;
351
- text-align: right;
352
- color: ${(props) =>
353
- props.isError
354
- ? props.theme.colors.red
355
- : props.hasLength
356
- ? props.theme.colors.black
357
- : props.theme.colors.mediumGray};
358
- `
359
-
360
- const SlotContainer = styled('span', inputProps)`
361
- text-align: right;
362
- border-left: 1px solid
363
- ${(props) =>
364
- props.isError
365
- ? props.theme.colors.red
366
- : props.hasLength
367
- ? props.theme.colors.black
368
- : props.theme.colors.mediumGray};
369
- position: absolute;
370
- width: ${(props) =>
371
- props.slotSize ? 'calc(' + props.slotSize + ' - 10px)' : 'fit-content'};
372
- right: 10px;
373
- top: 10px;
374
- padding-left: 10px;
375
- color: ${(props) =>
376
- props.isError
377
- ? props.theme.colors.red
378
- : props.hasLength
379
- ? props.theme.colors.black
380
- : props.theme.colors.mediumGray};
381
- `
382
-
383
- const LabelWrapper = styled('div', inputProps)`
384
- display: flex;
385
- align-items: center;
386
- gap: 10px;
387
- margin-bottom: 8px;
388
- cursor: ${(props) => (props.isInteractive ? 'ew-resize' : 'auto')};
389
- `
390
- const LabelSlotWrapper = styled('div', inputProps)`
391
- display: flex;
392
- gap: 10px;
393
- align-items: center;
394
- cursor: ${(props) => (props.isInteractive ? 'ew-resize' : 'auto')};
395
- border: ${(props) =>
396
- props.alignItems == 'vertical'
397
- ? 'none'
398
- : props.isError
399
- ? '1px solid ' + props.theme.colors.red
400
- : props.noBorder
401
- ? 'none'
402
- : props.borderColor
403
- ? props.theme.colors[props.borderColor]
404
- ? '1px solid ' + props.theme.colors[props.borderColor]
405
- : '1px solid ' + props.borderColor
406
- : '1px solid ' + props.theme.colors.grey4};
407
- border-radius: 4px 0 0 4px;
408
- border-right: none;
409
- `
410
-
411
- const LabelText = styled('div', inputProps)`
412
- font-size: 13px;
413
- color: ${(props) =>
414
- props.theme.colors[props.labelFontColor]
415
- ? props.theme.colors[props.labelFontColor]
416
- : props.labelFontColor};
417
- font-weight: ${(props) => props.labelFontWeight};
418
- `
419
-
420
- const IconAttrs = { size: String, marginRight: Number }
421
- const IconWrapper = styled('div', IconAttrs)`
422
- position: absolute;
423
- top: 0;
424
- bottom: 0;
425
- margin: auto;
426
- right: ${(props) => props.marginRight + 10}px;
427
- height: ${(props) => (props.size ? props.size : 'auto')};
428
- `
429
-
430
- const SelectText = styled.div`
431
- font-size: 13px;
432
- `
433
-
434
- const SelectWrapper = styled.div`
435
- position: absolute;
436
- top: 2px;
437
- right: 2px;
438
- display: flex;
439
- height: 100%;
440
- `
441
-
442
- const Divider = styled.div`
443
- margin-top: 6px;
444
- height: calc(100% - 16px);
445
- width: 1px;
446
- background-color: ${({ theme }) => theme.colors.grey4};
447
- `
448
-
449
- export default {
450
- name: 'InputNumber',
451
- components: {
452
- Container,
453
- InputContainer,
454
- InputWrapper,
455
- UnitContainer,
456
- ErrorMessage,
457
- LabelWrapper,
458
- LabelSlotWrapper,
459
- LabelText,
460
- InfoText,
461
- Icon,
462
- SlotContainer,
463
- IconWrapper,
464
- RCSelect,
465
- RCOption,
466
- SelectWrapper,
467
- SelectText,
468
- Divider,
469
- ArrowControls,
470
- ArrowButton,
471
- ArrowDivider,
472
- },
473
- inheritAttrs: false,
474
- props: {
475
- placeholder: {
476
- type: String,
477
- required: false,
478
- default: '',
479
- },
480
- isError: {
481
- type: Boolean,
482
- required: false,
483
- default: false,
484
- },
485
- inputWidth: {
486
- type: String,
487
- required: false,
488
- default: null,
489
- },
490
- minWidth: {
491
- type: String,
492
- required: false,
493
- default: null,
494
- },
495
- inputHeight: {
496
- type: String,
497
- required: false,
498
- default: '40px',
499
- },
500
- value: {
501
- type: [String, Number],
502
- required: true,
503
- default: null,
504
- },
505
- clearInput: {
506
- type: Boolean,
507
- required: false,
508
- default: false,
509
- },
510
- alignItems: {
511
- type: String,
512
- required: false,
513
- default: 'vertical',
514
- },
515
- errorMessage: {
516
- type: String,
517
- required: false,
518
- default: 'Please insert a correct number',
519
- },
520
- numberPrecision: {
521
- type: Number,
522
- required: false,
523
- default: 0,
524
- },
525
- minDecimals: {
526
- type: Number,
527
- required: false,
528
- default: 0,
529
- },
530
- unitName: {
531
- type: String,
532
- required: false,
533
- default: '',
534
- },
535
- showLinearUnitName: {
536
- type: Boolean,
537
- required: false,
538
- default: false,
539
- },
540
- disabled: {
541
- type: Boolean,
542
- required: false,
543
- default: false,
544
- },
545
- noBorder: {
546
- type: Boolean,
547
- required: false,
548
- default: false,
549
- },
550
- borderColor: {
551
- type: String,
552
- required: false,
553
- default: null,
554
- },
555
- textAlign: {
556
- type: String,
557
- required: false,
558
- default: 'left',
559
- },
560
- fontSize: {
561
- type: String,
562
- required: false,
563
- default: '13px',
564
- },
565
- isInteractive: {
566
- type: Boolean,
567
- required: false,
568
- default: false,
569
- },
570
- interactionStep: {
571
- type: Number,
572
- required: false,
573
- default: 1,
574
- },
575
- labelText: {
576
- type: String,
577
- required: false,
578
- default: null,
579
- },
580
- labelInfoText: {
581
- type: String,
582
- required: false,
583
- default: null,
584
- },
585
- labelInfoAlign: {
586
- type: String,
587
- required: false,
588
- default: 'left',
589
- },
590
- defaultNumber: {
591
- type: Number,
592
- required: false,
593
- default: null,
594
- },
595
- minNumber: {
596
- type: Number,
597
- required: false,
598
- default: null,
599
- },
600
- fontColor: {
601
- type: String,
602
- required: false,
603
- default: null,
604
- },
605
- backgroundColor: {
606
- type: String,
607
- required: false,
608
- default: null,
609
- },
610
- numberToStringEnabled: {
611
- type: Boolean,
612
- required: false,
613
- default: true,
614
- },
615
- allowNegative: {
616
- type: Boolean,
617
- required: false,
618
- default: true,
619
- },
620
- slotSize: {
621
- type: String,
622
- required: false,
623
- default: null,
624
- },
625
- labelFontColor: {
626
- type: String,
627
- required: false,
628
- default: 'eturnityGrey',
629
- },
630
- labelFontWeight: {
631
- type: String,
632
- required: false,
633
- default: '700',
634
- },
635
- focus: {
636
- type: Boolean,
637
- required: false,
638
- default: false,
639
- },
640
- labelDataId: {
641
- type: String,
642
- required: false,
643
- default: '',
644
- },
645
- inputDataId: {
646
- type: String,
647
- required: false,
648
- default: '',
649
- },
650
- showSelect: {
651
- type: Boolean,
652
- default: false,
653
- },
654
- selectWidth: {
655
- type: Number,
656
- default: 70,
657
- },
658
- selectOptions: {
659
- type: Array,
660
- default: () => [],
661
- },
662
- selectValue: {
663
- type: [String, Number],
664
- default: null,
665
- },
666
- isSelectDisabled: {
667
- type: Boolean,
668
- default: false,
669
- },
670
- colorMode: {
671
- type: String,
672
- default: '',
673
- },
674
- showArrowControls: {
675
- type: Boolean,
676
- default: false,
677
- },
678
- },
679
- data() {
680
- return {
681
- textInput: '',
682
- isFocused: false,
683
- warningIcon: warningIcon,
684
- }
685
- },
686
- computed: {
687
- displayedPlaceholder() {
688
- if (this.placeholder) return this.placeholder
689
- if (this.defaultNumber)
690
- return `${this.defaultNumber} ${this.unitName ? this.unitName : ''}`
691
- return `${this.minNumber || 0} ${this.unitName ? this.unitName : ''}`
692
- },
693
- hasSlot() {
694
- return !!this.$slots.default
695
- },
696
- hasLabelSlot() {
697
- return !!this.$slots.label
698
- },
699
- getSelectValue() {
700
- const item = this.selectOptions.find(
701
- ({ value }) => value === this.selectValue
702
- )
703
-
704
- return item ? item.label : '-'
705
- },
706
- },
707
- watch: {
708
- focus(value) {
709
- if (value) {
710
- this.focusInput()
711
- }
712
- },
713
- clearInput: function (value) {
714
- if (value) {
715
- // If the value is typed, then we should clear the textInput on Continue
716
- this.textInput = ''
717
- }
718
- },
719
- },
720
- created() {
721
- if (this.value) {
722
- this.textInput = numberToString({
723
- value: this.value,
724
- numberPrecision: this.numberPrecision,
725
- minDecimals: this.minDecimals,
726
- })
727
- } else if (this.defaultNumber !== null) {
728
- this.textInput = numberToString({
729
- value: this.defaultNumber,
730
- numberPrecision: this.numberPrecision,
731
- minDecimals: this.minDecimals,
732
- })
733
- } else if (this.minNumber !== null) {
734
- this.textInput = numberToString({
735
- value: this.minNumber,
736
- numberPrecision: this.numberPrecision,
737
- minDecimals: this.minDecimals,
738
- })
739
- }
740
- },
741
- mounted() {
742
- if (this.focus) {
743
- this.focusInput()
744
- }
745
- },
746
- methods: {
747
- incrementValue() {
748
- const currentValue = Math.max(
749
- parseFloat(this.textInput || 0),
750
- this.minNumber || 0
751
- )
752
- const newValue = currentValue + this.interactionStep
753
- this.textInput = numberToString({
754
- value: newValue,
755
- numberPrecision: this.numberPrecision,
756
- minDecimals: this.minDecimals,
757
- })
758
- this.$emit('on-input', newValue)
759
- this.$emit('input-change', newValue)
760
- },
761
- decrementValue() {
762
- const currentValue = Math.max(
763
- parseFloat(this.textInput || 0),
764
- this.minNumber || 0
765
- )
766
- const newValue = currentValue - this.interactionStep
767
- if (this.allowNegative || newValue >= 0) {
768
- this.textInput = numberToString({
769
- value: newValue,
770
- numberPrecision: this.numberPrecision,
771
- minDecimals: this.minDecimals,
772
- })
773
- this.$emit('on-input', newValue)
774
- this.$emit('input-change', newValue)
775
- }
776
- },
777
- onEnterPress() {
778
- this.$emit('on-enter-click')
779
- this.$refs.inputField1.$el.blur()
780
- },
781
- onChangeHandler(event) {
782
- if (isNaN(event) || event === '') {
783
- event = this.defaultNumber
784
- ? this.defaultNumber
785
- : this.minNumber || this.minNumber === 0
786
- ? this.minNumber
787
- : event
788
- }
789
- if (!this.allowNegative) {
790
- event = Math.abs(event)
791
- }
792
- event = parseFloat(event)
793
- // Need to return an integer rather than a string
794
- this.$emit('input-change', event)
795
- },
796
- onEvaluateCode(event) {
797
- // function to perform math on the code
798
- // filter the string in case of any malicious content
799
- const val = event.target.value
800
- let filtered = val.replace('(auto)', '').replace(/[^-()\d/*+.,]/g, '')
801
- filtered = filtered.split(/([-+*/()])/)
802
- let formatted = filtered.map((item) => {
803
- if (
804
- item === '+' ||
805
- item === '-' ||
806
- item === '*' ||
807
- item === '/' ||
808
- item === '(' ||
809
- item === ')' ||
810
- item === ''
811
- ) {
812
- return item
813
- } else {
814
- let num = stringToNumber({
815
- value: item,
816
- numberPrecision: false,
817
- minDecimals: this.minDecimals,
818
- })
819
- return num
820
- }
821
- })
822
- let evaluated
823
- formatted = this.removeStringItemsAfterLastNumber(formatted)
824
- evaluated = eval(formatted.join(' '))
825
- if (typeof evaluated === 'string') {
826
- evaluated = stringToNumber({
827
- value: evaluated,
828
- numberPrecision: this.numberPrecision,
829
- minDecimals: this.minDecimals,
830
- })
831
- } else if (typeof evaluated === 'number') {
832
- evaluated = evaluated.toFixed(this.numberPrecision)
833
- }
834
- return evaluated
835
- },
836
- removeStringItemsAfterLastNumber(array) {
837
- // fixed in EPDM-6487, in order to prevent 'Unexpected end of input'
838
- let lastNumberIndex = -1
839
- // Find the index of the last number in the array
840
- for (let i = array.length - 1; i >= 0; i--) {
841
- if (typeof array[i] === 'number') {
842
- lastNumberIndex = i
843
- break
844
- }
845
- }
846
- // if there are no numbers, return an empty array
847
- if (lastNumberIndex === -1) {
848
- return []
849
- }
850
- // Remove non-numeric items after the last number
851
- if (lastNumberIndex !== -1) {
852
- const newArray = array.slice(0, lastNumberIndex + 1)
853
- return newArray
854
- }
855
- return array
856
- },
857
- onInput(event) {
858
- if (!this.isFocused) {
859
- return
860
- }
861
- if (event.target.value === '') {
862
- this.$emit('on-input', '')
863
- }
864
- let evaluatedVal
865
- try {
866
- evaluatedVal = this.onEvaluateCode(event)
867
- } finally {
868
- if (evaluatedVal && this.value != evaluatedVal) {
869
- this.$emit('on-input', evaluatedVal)
870
- }
871
- }
872
- this.textInput = evaluatedVal
873
- },
874
- onInputBlur(e) {
875
- this.isFocused = false
876
- let value = e.target.value
877
- let evaluatedInput = this.onEvaluateCode(e)
878
- this.onChangeHandler(evaluatedInput ? evaluatedInput : value)
879
- if ((evaluatedInput && value.length) || this.minNumber !== null) {
880
- this.textInput = numberToString({
881
- value:
882
- evaluatedInput && value.length
883
- ? evaluatedInput
884
- : this.defaultNumber
885
- ? this.defaultNumber
886
- : this.minNumber,
887
- numberPrecision: this.numberPrecision,
888
- minDecimals: this.minDecimals,
889
- })
890
- }
891
- let adjustedMinValue =
892
- evaluatedInput && evaluatedInput.length
893
- ? evaluatedInput
894
- : this.defaultNumber
895
- ? this.defaultNumber
896
- : this.minNumber || this.minNumber === 0
897
- ? this.minNumber
898
- : ''
899
- this.$emit('input-blur', adjustedMinValue)
900
- },
901
- focusInput() {
902
- if (this.disabled) {
903
- return
904
- }
905
- this.isFocused = true
906
- this.$nextTick(() => {
907
- this.$refs.inputField1.$el.select()
908
- })
909
- this.$emit('input-focus')
910
- },
911
- blurInput() {
912
- if (this.disabled) {
913
- return
914
- }
915
- this.isFocused = false
916
- this.$nextTick(() => {
917
- this.$refs.inputField1.$el.blur()
918
- })
919
- },
920
- formatWithCurrency(value) {
921
- let adjustedMinValue =
922
- value || value === 0
923
- ? value
924
- : this.defaultNumber
925
- ? this.defaultNumber
926
- : this.minNumber || this.minNumber === 0
927
- ? this.minNumber
928
- : ''
929
- if ((adjustedMinValue || adjustedMinValue === 0) && !this.isFocused) {
930
- let input = this.numberToStringEnabled
931
- ? numberToString({
932
- value: adjustedMinValue,
933
- numberPrecision: this.numberPrecision,
934
- minDecimals: this.minDecimals,
935
- })
936
- : adjustedMinValue
937
- let unit = this.showLinearUnitName ? '' : this.unitName
938
- //return input + ' ' + unit
939
- return input + ' ' + unit
940
- } else if (!adjustedMinValue && adjustedMinValue !== 0) {
941
- return ''
942
- } else {
943
- return this.numberToStringEnabled
944
- ? numberToString({
945
- value: adjustedMinValue,
946
- numberPrecision: this.numberPrecision,
947
- minDecimals: this.minDecimals,
948
- })
949
- : adjustedMinValue
950
- }
951
- },
952
- initInteraction(e) {
953
- this.focusInput()
954
- e.preventDefault()
955
- window.addEventListener('mousemove', this.interact, false)
956
- window.addEventListener('mouseup', this.stopInteract, false)
957
- },
958
- interact(e) {
959
- e.preventDefault()
960
- let value = parseFloat(this.value || 0)
961
- value += parseFloat(this.interactionStep) * parseInt(e.movementX)
962
- this.$emit('on-input-drag', value)
963
-
964
- this.textInput = numberToString({
965
- value: value && value.length ? value : this.minNumber,
966
- numberPrecision: this.numberPrecision,
967
- minDecimals: this.minDecimals,
968
- })
969
- //this.value=value
970
- },
971
- stopInteract(e) {
972
- e.preventDefault()
973
- window.removeEventListener('mousemove', this.interact, false)
974
- window.removeEventListener('mouseup', this.stopInteract, false)
975
- this.blurInput()
976
- },
977
- },
978
- }
979
- </script>
1
+ <template>
2
+ <Container :align-items="alignItems" :input-width="inputWidth">
3
+ <LabelSlotWrapper
4
+ v-if="hasLabelSlot"
5
+ :align-items="alignItems"
6
+ :border-color="borderColor"
7
+ :is-error="isError"
8
+ :is-interactive="isInteractive"
9
+ :no-border="noBorder"
10
+ @mousedown="initInteraction"
11
+ >
12
+ <slot name="label"></slot>
13
+ </LabelSlotWrapper>
14
+
15
+ <LabelWrapper v-if="labelText">
16
+ <LabelText
17
+ :data-id="labelDataId"
18
+ :label-font-color="labelFontColor"
19
+ :label-font-weight="labelFontWeight"
20
+ >
21
+ {{ labelText }}
22
+ </LabelText>
23
+
24
+ <InfoText
25
+ v-if="labelInfoText"
26
+ :align-arrow="labelInfoAlign"
27
+ :text="labelInfoText"
28
+ />
29
+ </LabelWrapper>
30
+ <InputWrapper>
31
+ <InputContainer
32
+ v-bind="$attrs"
33
+ ref="inputField1"
34
+ :align-items="alignItems"
35
+ :background-color="
36
+ colorMode === 'transparent' ? 'transparent' : backgroundColor
37
+ "
38
+ :border-color="
39
+ colorMode === 'transparent' && !borderColor ? 'white' : borderColor
40
+ "
41
+ :color-mode="colorMode"
42
+ :data-id="inputDataId"
43
+ :disabled="disabled"
44
+ :font-color="colorMode === 'transparent' ? 'white' : fontColor"
45
+ :font-size="fontSize"
46
+ :has-label-slot="hasLabelSlot"
47
+ :has-slot="hasSlot"
48
+ :has-unit="unitName && !!unitName.length"
49
+ :input-height="inputHeight"
50
+ :is-disabled="disabled"
51
+ :is-error="isError"
52
+ :is-interactive="isInteractive"
53
+ :min-width="minWidth"
54
+ :no-border="noBorder"
55
+ :placeholder="displayedPlaceholder"
56
+ :show-arrow-controls="showArrowControls"
57
+ :show-linear-unit-name="showLinearUnitName"
58
+ :slot-size="slotSize"
59
+ :text-align="textAlign"
60
+ :value="formatWithCurrency(value)"
61
+ @blur="onInputBlur($event)"
62
+ @focus="focusInput()"
63
+ @input="onInput($event)"
64
+ @keydown.down="decrementValue"
65
+ @keydown.up="incrementValue"
66
+ @keyup.enter="onEnterPress"
67
+ />
68
+ <SlotContainer v-if="hasSlot" :is-error="isError" :slot-size="slotSize">
69
+ <slot></slot>
70
+ </SlotContainer>
71
+
72
+ <UnitContainer
73
+ v-if="unitName && showLinearUnitName && !hasSlot"
74
+ :has-length="!!textInput.length"
75
+ :is-error="isError"
76
+ >{{ unitName }}</UnitContainer
77
+ >
78
+ <IconWrapper
79
+ v-if="isError && !showLinearUnitName"
80
+ :margin-right="showSelect ? selectWidth : 0"
81
+ size="16px"
82
+ >
83
+ <Icon cursor="default" name="warning" size="16px" />
84
+ </IconWrapper>
85
+ <SelectWrapper v-if="showSelect">
86
+ <Divider />
87
+ <RCSelect
88
+ :disabled="isSelectDisabled"
89
+ :select-width="`${selectWidth}px`"
90
+ :show-border="false"
91
+ @input-change="$emit('select-change', $event)"
92
+ >
93
+ <template #selector>
94
+ <SelectText>{{ getSelectValue }}</SelectText>
95
+ </template>
96
+ <template #dropdown>
97
+ <RCOption
98
+ v-for="item in selectOptions"
99
+ :key="item.value"
100
+ :value="item.value"
101
+ >
102
+ {{ item.label }}
103
+ </RCOption>
104
+ </template>
105
+ </RCSelect>
106
+ </SelectWrapper>
107
+
108
+ <ArrowControls
109
+ v-if="!disabled && showArrowControls"
110
+ :color-mode="colorMode"
111
+ >
112
+ <ArrowButton @click="incrementValue">
113
+ <Icon
114
+ :color="colorMode === 'transparent' ? 'white' : undefined"
115
+ name="arrow_up"
116
+ size="8px"
117
+ />
118
+ </ArrowButton>
119
+ <ArrowDivider :color-mode="colorMode" />
120
+ <ArrowButton
121
+ :is-disabled="textInput <= minNumber"
122
+ @click="decrementValue"
123
+ >
124
+ <Icon
125
+ :color="colorMode === 'transparent' ? 'white' : undefined"
126
+ :disabled="textInput <= minNumber"
127
+ name="arrow_down"
128
+ size="8px"
129
+ />
130
+ </ArrowButton>
131
+ </ArrowControls>
132
+ </InputWrapper>
133
+ <ErrorMessage v-if="isError">{{ errorMessage }}</ErrorMessage>
134
+ </Container>
135
+ </template>
136
+
137
+ <script>
138
+ // import InputNumber from "@eturnity/eturnity_reusable_components/src/components/inputs/inputNumber"
139
+ //This component should be used for questions with input fields only
140
+ //How to use:
141
+ // <input-number
142
+ // placeholder="Enter distance"
143
+ // :isError="false" //default is false
144
+ // inputWidth="150px" //by default, this is 100%
145
+ // minWidth="100px"
146
+ // :numberPrecision="3"
147
+ // minDecimals="2"
148
+ // unitName="pc"
149
+ // :value="inputValue" //required -- String
150
+ // @input-change="onInputChange($event)" //required
151
+ // @on-enter-click="onInputSubmit()"
152
+ // :errorMessage="Enter a number between 1 and 10"
153
+ // :disabled="false"
154
+ // :noBorder="true"
155
+ // textAlign="left" // "left, right, center"
156
+ // :showLinearUnitName="true"
157
+ // fontSize="13px"
158
+ // labelText="Number of Modules"
159
+ // labelInfoText="Here is some information for you..."
160
+ // labelInfoAlign="left"
161
+ // :minNumber="0"
162
+ // fontColor="blue"
163
+ // colorMode="transparent" // Makes background transparent, border white, and font white
164
+ // >
165
+ //<template name=label><img>....</template>
166
+ //</inputNumber>
167
+ import styled from 'vue3-styled-components'
168
+ import {
169
+ stringToNumber,
170
+ numberToString,
171
+ } from '../../../helpers/numberConverter'
172
+ import InfoText from '../../infoText'
173
+ import ErrorMessage from '../../errorMessage'
174
+ import RCSelect from '../select'
175
+ import RCOption from '../select/option'
176
+ import warningIcon from '../../../assets/icons/error_icon.png'
177
+ import Icon from '../../icon'
178
+
179
+ const inputProps = {
180
+ isError: Boolean,
181
+ hasUnit: Boolean,
182
+ inputWidth: String,
183
+ minWidth: String,
184
+ isDisabled: Boolean,
185
+ noBorder: Boolean,
186
+ textAlign: String,
187
+ fontSize: String,
188
+ fontColor: String,
189
+ backgroundColor: String,
190
+ hasSlot: Boolean,
191
+ hasLabelSlot: Boolean,
192
+ slotSize: String,
193
+ inputHeight: String,
194
+ isInteractive: Boolean,
195
+ alignItems: String,
196
+ labelFontColor: String,
197
+ labelFontWeight: String,
198
+ borderColor: String,
199
+ showLinearUnitName: Boolean,
200
+ colorMode: String,
201
+ showArrowControls: Boolean,
202
+ }
203
+
204
+ const Container = styled('div', inputProps)`
205
+ width: ${(props) => (props.inputWidth ? props.inputWidth : '100%')};
206
+ position: relative;
207
+ display: grid;
208
+ grid-template-columns: ${(props) =>
209
+ props.alignItems === 'vertical' ? '1fr' : 'auto 1fr'};
210
+ `
211
+
212
+ const InputContainer = styled('input', inputProps)`
213
+ border: ${(props) =>
214
+ props.isError
215
+ ? '1px solid ' + props.theme.colors.red
216
+ : props.noBorder
217
+ ? 'none'
218
+ : props.borderColor
219
+ ? props.theme.colors[props.borderColor]
220
+ ? '1px solid ' + props.theme.colors[props.borderColor]
221
+ : '1px solid ' + props.borderColor
222
+ : '1px solid ' + props.theme.colors.grey4};
223
+ height: ${(props) => props.inputHeight};
224
+ max-height: ${(props) => props.inputHeight};
225
+ padding: ${({ colorMode }) =>
226
+ colorMode === 'transparent' ? '10px 15px' : '0 10px'};
227
+ padding-right: ${({
228
+ slotSize,
229
+ isError,
230
+ showLinearUnitName,
231
+ colorMode,
232
+ showArrowControls,
233
+ }) =>
234
+ showArrowControls
235
+ ? '40px'
236
+ : colorMode === 'transparent'
237
+ ? '0'
238
+ : slotSize
239
+ ? isError && !showLinearUnitName
240
+ ? 'calc(' + slotSize + ' + 24px)'
241
+ : 'calc(' + slotSize + ' + 10px)'
242
+ : isError && !showLinearUnitName
243
+ ? '24px'
244
+ : '5px'};
245
+ border-radius: ${(props) =>
246
+ props.isInteractive && props.alignItems != 'vertical'
247
+ ? '0 4px 4px 0'
248
+ : '4px'};
249
+ text-align: ${(props) => props.textAlign};
250
+ cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'auto')};
251
+ font-size: ${(props) => (props.fontSize ? props.fontSize : '13px')};
252
+ color: ${(props) =>
253
+ props.isError
254
+ ? props.theme.colors.grey6
255
+ : props.isDisabled
256
+ ? props.colorMode === 'transparent'
257
+ ? props.theme.colors.white
258
+ : props.theme.colors.grey2
259
+ : props.fontColor
260
+ ? props.fontColor + ' !important'
261
+ : props.theme.colors.black};
262
+ background-color: ${(props) =>
263
+ props.isDisabled
264
+ ? props.colorMode === 'transparent'
265
+ ? 'transparent'
266
+ : props.theme.colors.grey5
267
+ : props.backgroundColor
268
+ ? props.backgroundColor + ' !important'
269
+ : props.theme.colors.white};
270
+ width: ${(props) =>
271
+ props.inputWidth && !props.hasLabelSlot ? props.inputWidth : '100%'};
272
+ min-width: ${(props) => (props.minWidth ? props.minWidth : 'unset')};
273
+ box-sizing: border-box;
274
+ opacity: ${(props) =>
275
+ props.isDisabled && props.colorMode === 'transparent' ? '0.4' : '1'};
276
+
277
+ &::placeholder {
278
+ color: ${(props) => props.theme.colors.grey2};
279
+ }
280
+
281
+ &:focus {
282
+ outline: none;
283
+ }
284
+ `
285
+
286
+ const ArrowControlsProps = {
287
+ colorMode: String,
288
+ }
289
+ const ArrowControls = styled('div', ArrowControlsProps)`
290
+ position: absolute;
291
+ right: 0;
292
+ top: 0;
293
+ bottom: 0;
294
+ display: grid;
295
+ grid-template-rows: 1fr auto 1fr;
296
+ align-items: center;
297
+ justify-items: center;
298
+ cursor: pointer;
299
+ width: 30px;
300
+ background-color: ${(props) =>
301
+ props.colorMode === 'transparent'
302
+ ? 'transparent'
303
+ : props.theme.colors.white};
304
+ border-left: 1px solid
305
+ ${(props) =>
306
+ props.colorMode === 'transparent'
307
+ ? props.theme.colors.white
308
+ : props.theme.colors.black};
309
+ `
310
+
311
+ const ArrowButtonProps = {
312
+ isDisabled: Boolean,
313
+ }
314
+ const ArrowButton = styled('button', ArrowButtonProps)`
315
+ background: transparent;
316
+ opacity: ${(props) => (props.isDisabled ? '0.2' : '1')};
317
+ cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'pointer')};
318
+ display: flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ padding: 0;
322
+ width: 100%;
323
+ height: 100%;
324
+ `
325
+
326
+ const ArrowDivider = styled('div', ArrowControlsProps)`
327
+ width: 100%;
328
+ height: 1px;
329
+ background-color: ${(props) =>
330
+ props.colorMode === 'transparent'
331
+ ? props.theme.colors.white
332
+ : props.theme.colors.black};
333
+ `
334
+
335
+ const InputWrapper = styled.span`
336
+ position: relative;
337
+ `
338
+
339
+ const UnitContainer = styled('span', inputProps)`
340
+ border-left: 1px solid
341
+ ${(props) =>
342
+ props.isError
343
+ ? props.theme.colors.red
344
+ : props.hasLength
345
+ ? props.theme.colors.black
346
+ : props.theme.colors.mediumGray};
347
+ position: absolute;
348
+ right: 10px;
349
+ top: 10px;
350
+ padding-left: 10px;
351
+ text-align: right;
352
+ color: ${(props) =>
353
+ props.isError
354
+ ? props.theme.colors.red
355
+ : props.hasLength
356
+ ? props.theme.colors.black
357
+ : props.theme.colors.mediumGray};
358
+ `
359
+
360
+ const SlotContainer = styled('span', inputProps)`
361
+ text-align: right;
362
+ border-left: 1px solid
363
+ ${(props) =>
364
+ props.isError
365
+ ? props.theme.colors.red
366
+ : props.hasLength
367
+ ? props.theme.colors.black
368
+ : props.theme.colors.mediumGray};
369
+ position: absolute;
370
+ width: ${(props) =>
371
+ props.slotSize ? 'calc(' + props.slotSize + ' - 10px)' : 'fit-content'};
372
+ right: 10px;
373
+ top: 10px;
374
+ padding-left: 10px;
375
+ color: ${(props) =>
376
+ props.isError
377
+ ? props.theme.colors.red
378
+ : props.hasLength
379
+ ? props.theme.colors.black
380
+ : props.theme.colors.mediumGray};
381
+ `
382
+
383
+ const LabelWrapper = styled('div', inputProps)`
384
+ display: flex;
385
+ align-items: center;
386
+ gap: 10px;
387
+ margin-bottom: 8px;
388
+ cursor: ${(props) => (props.isInteractive ? 'ew-resize' : 'auto')};
389
+ `
390
+ const LabelSlotWrapper = styled('div', inputProps)`
391
+ display: flex;
392
+ gap: 10px;
393
+ align-items: center;
394
+ cursor: ${(props) => (props.isInteractive ? 'ew-resize' : 'auto')};
395
+ border: ${(props) =>
396
+ props.alignItems == 'vertical'
397
+ ? 'none'
398
+ : props.isError
399
+ ? '1px solid ' + props.theme.colors.red
400
+ : props.noBorder
401
+ ? 'none'
402
+ : props.borderColor
403
+ ? props.theme.colors[props.borderColor]
404
+ ? '1px solid ' + props.theme.colors[props.borderColor]
405
+ : '1px solid ' + props.borderColor
406
+ : '1px solid ' + props.theme.colors.grey4};
407
+ border-radius: 4px 0 0 4px;
408
+ border-right: none;
409
+ `
410
+
411
+ const LabelText = styled('div', inputProps)`
412
+ font-size: 13px;
413
+ color: ${(props) =>
414
+ props.theme.colors[props.labelFontColor]
415
+ ? props.theme.colors[props.labelFontColor]
416
+ : props.labelFontColor};
417
+ font-weight: ${(props) => props.labelFontWeight};
418
+ `
419
+
420
+ const IconAttrs = { size: String, marginRight: Number }
421
+ const IconWrapper = styled('div', IconAttrs)`
422
+ position: absolute;
423
+ top: 0;
424
+ bottom: 0;
425
+ margin: auto;
426
+ right: ${(props) => props.marginRight + 10}px;
427
+ height: ${(props) => (props.size ? props.size : 'auto')};
428
+ `
429
+
430
+ const SelectText = styled.div`
431
+ font-size: 13px;
432
+ `
433
+
434
+ const SelectWrapper = styled.div`
435
+ position: absolute;
436
+ top: 2px;
437
+ right: 2px;
438
+ display: flex;
439
+ height: 100%;
440
+ `
441
+
442
+ const Divider = styled.div`
443
+ margin-top: 6px;
444
+ height: calc(100% - 16px);
445
+ width: 1px;
446
+ background-color: ${({ theme }) => theme.colors.grey4};
447
+ `
448
+
449
+ export default {
450
+ name: 'InputNumber',
451
+ components: {
452
+ Container,
453
+ InputContainer,
454
+ InputWrapper,
455
+ UnitContainer,
456
+ ErrorMessage,
457
+ LabelWrapper,
458
+ LabelSlotWrapper,
459
+ LabelText,
460
+ InfoText,
461
+ Icon,
462
+ SlotContainer,
463
+ IconWrapper,
464
+ RCSelect,
465
+ RCOption,
466
+ SelectWrapper,
467
+ SelectText,
468
+ Divider,
469
+ ArrowControls,
470
+ ArrowButton,
471
+ ArrowDivider,
472
+ },
473
+ inheritAttrs: false,
474
+ props: {
475
+ placeholder: {
476
+ type: String,
477
+ required: false,
478
+ default: '',
479
+ },
480
+ isError: {
481
+ type: Boolean,
482
+ required: false,
483
+ default: false,
484
+ },
485
+ inputWidth: {
486
+ type: String,
487
+ required: false,
488
+ default: null,
489
+ },
490
+ minWidth: {
491
+ type: String,
492
+ required: false,
493
+ default: null,
494
+ },
495
+ inputHeight: {
496
+ type: String,
497
+ required: false,
498
+ default: '40px',
499
+ },
500
+ value: {
501
+ type: [String, Number],
502
+ required: true,
503
+ default: null,
504
+ },
505
+ clearInput: {
506
+ type: Boolean,
507
+ required: false,
508
+ default: false,
509
+ },
510
+ alignItems: {
511
+ type: String,
512
+ required: false,
513
+ default: 'vertical',
514
+ },
515
+ errorMessage: {
516
+ type: String,
517
+ required: false,
518
+ default: 'Please insert a correct number',
519
+ },
520
+ numberPrecision: {
521
+ type: Number,
522
+ required: false,
523
+ default: 0,
524
+ },
525
+ minDecimals: {
526
+ type: Number,
527
+ required: false,
528
+ default: 0,
529
+ },
530
+ unitName: {
531
+ type: String,
532
+ required: false,
533
+ default: '',
534
+ },
535
+ showLinearUnitName: {
536
+ type: Boolean,
537
+ required: false,
538
+ default: false,
539
+ },
540
+ disabled: {
541
+ type: Boolean,
542
+ required: false,
543
+ default: false,
544
+ },
545
+ noBorder: {
546
+ type: Boolean,
547
+ required: false,
548
+ default: false,
549
+ },
550
+ borderColor: {
551
+ type: String,
552
+ required: false,
553
+ default: null,
554
+ },
555
+ textAlign: {
556
+ type: String,
557
+ required: false,
558
+ default: 'left',
559
+ },
560
+ fontSize: {
561
+ type: String,
562
+ required: false,
563
+ default: '13px',
564
+ },
565
+ isInteractive: {
566
+ type: Boolean,
567
+ required: false,
568
+ default: false,
569
+ },
570
+ interactionStep: {
571
+ type: Number,
572
+ required: false,
573
+ default: 1,
574
+ },
575
+ labelText: {
576
+ type: String,
577
+ required: false,
578
+ default: null,
579
+ },
580
+ labelInfoText: {
581
+ type: String,
582
+ required: false,
583
+ default: null,
584
+ },
585
+ labelInfoAlign: {
586
+ type: String,
587
+ required: false,
588
+ default: 'left',
589
+ },
590
+ defaultNumber: {
591
+ type: Number,
592
+ required: false,
593
+ default: null,
594
+ },
595
+ minNumber: {
596
+ type: Number,
597
+ required: false,
598
+ default: null,
599
+ },
600
+ fontColor: {
601
+ type: String,
602
+ required: false,
603
+ default: null,
604
+ },
605
+ backgroundColor: {
606
+ type: String,
607
+ required: false,
608
+ default: null,
609
+ },
610
+ numberToStringEnabled: {
611
+ type: Boolean,
612
+ required: false,
613
+ default: true,
614
+ },
615
+ allowNegative: {
616
+ type: Boolean,
617
+ required: false,
618
+ default: true,
619
+ },
620
+ slotSize: {
621
+ type: String,
622
+ required: false,
623
+ default: null,
624
+ },
625
+ labelFontColor: {
626
+ type: String,
627
+ required: false,
628
+ default: 'eturnityGrey',
629
+ },
630
+ labelFontWeight: {
631
+ type: String,
632
+ required: false,
633
+ default: '700',
634
+ },
635
+ focus: {
636
+ type: Boolean,
637
+ required: false,
638
+ default: false,
639
+ },
640
+ labelDataId: {
641
+ type: String,
642
+ required: false,
643
+ default: '',
644
+ },
645
+ inputDataId: {
646
+ type: String,
647
+ required: false,
648
+ default: '',
649
+ },
650
+ showSelect: {
651
+ type: Boolean,
652
+ default: false,
653
+ },
654
+ selectWidth: {
655
+ type: Number,
656
+ default: 70,
657
+ },
658
+ selectOptions: {
659
+ type: Array,
660
+ default: () => [],
661
+ },
662
+ selectValue: {
663
+ type: [String, Number],
664
+ default: null,
665
+ },
666
+ isSelectDisabled: {
667
+ type: Boolean,
668
+ default: false,
669
+ },
670
+ colorMode: {
671
+ type: String,
672
+ default: '',
673
+ },
674
+ showArrowControls: {
675
+ type: Boolean,
676
+ default: false,
677
+ },
678
+ },
679
+ data() {
680
+ return {
681
+ textInput: '',
682
+ isFocused: false,
683
+ warningIcon: warningIcon,
684
+ }
685
+ },
686
+ computed: {
687
+ displayedPlaceholder() {
688
+ if (this.placeholder) return this.placeholder
689
+ if (this.defaultNumber)
690
+ return `${this.defaultNumber} ${this.unitName ? this.unitName : ''}`
691
+ return `${this.minNumber || 0} ${this.unitName ? this.unitName : ''}`
692
+ },
693
+ hasSlot() {
694
+ return !!this.$slots.default
695
+ },
696
+ hasLabelSlot() {
697
+ return !!this.$slots.label
698
+ },
699
+ getSelectValue() {
700
+ const item = this.selectOptions.find(
701
+ ({ value }) => value === this.selectValue
702
+ )
703
+
704
+ return item ? item.label : '-'
705
+ },
706
+ },
707
+ watch: {
708
+ focus(value) {
709
+ if (value) {
710
+ this.focusInput()
711
+ }
712
+ },
713
+ clearInput: function (value) {
714
+ if (value) {
715
+ // If the value is typed, then we should clear the textInput on Continue
716
+ this.textInput = ''
717
+ }
718
+ },
719
+ },
720
+ created() {
721
+ if (this.value) {
722
+ this.textInput = numberToString({
723
+ value: this.value,
724
+ numberPrecision: this.numberPrecision,
725
+ minDecimals: this.minDecimals,
726
+ })
727
+ } else if (this.defaultNumber !== null) {
728
+ this.textInput = numberToString({
729
+ value: this.defaultNumber,
730
+ numberPrecision: this.numberPrecision,
731
+ minDecimals: this.minDecimals,
732
+ })
733
+ } else if (this.minNumber !== null) {
734
+ this.textInput = numberToString({
735
+ value: this.minNumber,
736
+ numberPrecision: this.numberPrecision,
737
+ minDecimals: this.minDecimals,
738
+ })
739
+ }
740
+ },
741
+ mounted() {
742
+ if (this.focus) {
743
+ this.focusInput()
744
+ }
745
+ },
746
+ methods: {
747
+ incrementValue() {
748
+ const currentValue = Math.max(
749
+ parseFloat(this.textInput || 0),
750
+ this.minNumber || 0
751
+ )
752
+ const newValue = currentValue + this.interactionStep
753
+ this.textInput = numberToString({
754
+ value: newValue,
755
+ numberPrecision: this.numberPrecision,
756
+ minDecimals: this.minDecimals,
757
+ })
758
+ this.$emit('on-input', newValue)
759
+ this.$emit('input-change', newValue)
760
+ },
761
+ decrementValue() {
762
+ const currentValue = Math.max(
763
+ parseFloat(this.textInput || 0),
764
+ this.minNumber || 0
765
+ )
766
+ const newValue = currentValue - this.interactionStep
767
+ if (this.allowNegative || newValue >= 0) {
768
+ this.textInput = numberToString({
769
+ value: newValue,
770
+ numberPrecision: this.numberPrecision,
771
+ minDecimals: this.minDecimals,
772
+ })
773
+ this.$emit('on-input', newValue)
774
+ this.$emit('input-change', newValue)
775
+ }
776
+ },
777
+ onEnterPress() {
778
+ this.$emit('on-enter-click')
779
+ this.$refs.inputField1.$el.blur()
780
+ },
781
+ onChangeHandler(event) {
782
+ if (isNaN(event) || event === '') {
783
+ event = this.defaultNumber
784
+ ? this.defaultNumber
785
+ : this.minNumber || this.minNumber === 0
786
+ ? this.minNumber
787
+ : event
788
+ }
789
+ if (!this.allowNegative) {
790
+ event = Math.abs(event)
791
+ }
792
+ event = parseFloat(event)
793
+ // Need to return an integer rather than a string
794
+ this.$emit('input-change', event)
795
+ },
796
+ onEvaluateCode(event) {
797
+ // function to perform math on the code
798
+ // filter the string in case of any malicious content
799
+ const val = event.target.value
800
+ let filtered = val.replace('(auto)', '').replace(/[^-()\d/*+.,]/g, '')
801
+ filtered = filtered.split(/([-+*/()])/)
802
+ let formatted = filtered.map((item) => {
803
+ if (
804
+ item === '+' ||
805
+ item === '-' ||
806
+ item === '*' ||
807
+ item === '/' ||
808
+ item === '(' ||
809
+ item === ')' ||
810
+ item === ''
811
+ ) {
812
+ return item
813
+ } else {
814
+ let num = stringToNumber({
815
+ value: item,
816
+ numberPrecision: false,
817
+ minDecimals: this.minDecimals,
818
+ })
819
+ return num
820
+ }
821
+ })
822
+ let evaluated
823
+ formatted = this.removeStringItemsAfterLastNumber(formatted)
824
+ evaluated = eval(formatted.join(' '))
825
+ if (typeof evaluated === 'string') {
826
+ evaluated = stringToNumber({
827
+ value: evaluated,
828
+ numberPrecision: this.numberPrecision,
829
+ minDecimals: this.minDecimals,
830
+ })
831
+ } else if (typeof evaluated === 'number') {
832
+ evaluated = evaluated.toFixed(this.numberPrecision)
833
+ }
834
+ return evaluated
835
+ },
836
+ removeStringItemsAfterLastNumber(array) {
837
+ // fixed in EPDM-6487, in order to prevent 'Unexpected end of input'
838
+ let lastNumberIndex = -1
839
+ // Find the index of the last number in the array
840
+ for (let i = array.length - 1; i >= 0; i--) {
841
+ if (typeof array[i] === 'number') {
842
+ lastNumberIndex = i
843
+ break
844
+ }
845
+ }
846
+ // if there are no numbers, return an empty array
847
+ if (lastNumberIndex === -1) {
848
+ return []
849
+ }
850
+ // Remove non-numeric items after the last number
851
+ if (lastNumberIndex !== -1) {
852
+ const newArray = array.slice(0, lastNumberIndex + 1)
853
+ return newArray
854
+ }
855
+ return array
856
+ },
857
+ onInput(event) {
858
+ if (!this.isFocused) {
859
+ return
860
+ }
861
+ if (event.target.value === '') {
862
+ this.$emit('on-input', '')
863
+ }
864
+ let evaluatedVal
865
+ try {
866
+ evaluatedVal = this.onEvaluateCode(event)
867
+ } finally {
868
+ if (evaluatedVal && this.value != evaluatedVal) {
869
+ this.$emit('on-input', evaluatedVal)
870
+ }
871
+ }
872
+ this.textInput = evaluatedVal
873
+ },
874
+ onInputBlur(e) {
875
+ this.isFocused = false
876
+ let value = e.target.value
877
+ let evaluatedInput = this.onEvaluateCode(e)
878
+ this.onChangeHandler(evaluatedInput ? evaluatedInput : value)
879
+ if ((evaluatedInput && value.length) || this.minNumber !== null) {
880
+ this.textInput = numberToString({
881
+ value:
882
+ evaluatedInput && value.length
883
+ ? evaluatedInput
884
+ : this.defaultNumber
885
+ ? this.defaultNumber
886
+ : this.minNumber,
887
+ numberPrecision: this.numberPrecision,
888
+ minDecimals: this.minDecimals,
889
+ })
890
+ }
891
+ let adjustedMinValue =
892
+ evaluatedInput && evaluatedInput.length
893
+ ? evaluatedInput
894
+ : this.defaultNumber
895
+ ? this.defaultNumber
896
+ : this.minNumber || this.minNumber === 0
897
+ ? this.minNumber
898
+ : ''
899
+ this.$emit('input-blur', adjustedMinValue)
900
+ },
901
+ focusInput() {
902
+ if (this.disabled) {
903
+ return
904
+ }
905
+ this.isFocused = true
906
+ this.$nextTick(() => {
907
+ this.$refs.inputField1.$el.select()
908
+ })
909
+ this.$emit('input-focus')
910
+ },
911
+ blurInput() {
912
+ if (this.disabled) {
913
+ return
914
+ }
915
+ this.isFocused = false
916
+ this.$nextTick(() => {
917
+ this.$refs.inputField1.$el.blur()
918
+ })
919
+ },
920
+ formatWithCurrency(value) {
921
+ let adjustedMinValue =
922
+ value || value === 0
923
+ ? value
924
+ : this.defaultNumber
925
+ ? this.defaultNumber
926
+ : this.minNumber || this.minNumber === 0
927
+ ? this.minNumber
928
+ : ''
929
+ if ((adjustedMinValue || adjustedMinValue === 0) && !this.isFocused) {
930
+ let input = this.numberToStringEnabled
931
+ ? numberToString({
932
+ value: adjustedMinValue,
933
+ numberPrecision: this.numberPrecision,
934
+ minDecimals: this.minDecimals,
935
+ })
936
+ : adjustedMinValue
937
+ let unit = this.showLinearUnitName ? '' : this.unitName
938
+ //return input + ' ' + unit
939
+ return input + ' ' + unit
940
+ } else if (!adjustedMinValue && adjustedMinValue !== 0) {
941
+ return ''
942
+ } else {
943
+ return this.numberToStringEnabled
944
+ ? numberToString({
945
+ value: adjustedMinValue,
946
+ numberPrecision: this.numberPrecision,
947
+ minDecimals: this.minDecimals,
948
+ })
949
+ : adjustedMinValue
950
+ }
951
+ },
952
+ initInteraction(e) {
953
+ this.focusInput()
954
+ e.preventDefault()
955
+ window.addEventListener('mousemove', this.interact, false)
956
+ window.addEventListener('mouseup', this.stopInteract, false)
957
+ },
958
+ interact(e) {
959
+ e.preventDefault()
960
+ let value = parseFloat(this.value || 0)
961
+ value += parseFloat(this.interactionStep) * parseInt(e.movementX)
962
+ this.$emit('on-input-drag', value)
963
+
964
+ this.textInput = numberToString({
965
+ value: value && value.length ? value : this.minNumber,
966
+ numberPrecision: this.numberPrecision,
967
+ minDecimals: this.minDecimals,
968
+ })
969
+ //this.value=value
970
+ },
971
+ stopInteract(e) {
972
+ e.preventDefault()
973
+ window.removeEventListener('mousemove', this.interact, false)
974
+ window.removeEventListener('mouseup', this.stopInteract, false)
975
+ this.blurInput()
976
+ },
977
+ },
978
+ }
979
+ </script>