@eturnity/eturnity_reusable_components 7.48.1-EPDM-10679.1 → 7.48.1-EPDM-12680.14

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