@eturnity/eturnity_reusable_components 7.30.3-EPDM-10647.0 → 7.30.3-EPDM-8441.0

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 (322) hide show
  1. package/.prettierrc +6 -6
  2. package/.storybook/main.js +8 -8
  3. package/.storybook/preview.js +46 -46
  4. package/README.md +29 -29
  5. package/babel.config.js +5 -5
  6. package/package.json +62 -62
  7. package/postcss.config.js +6 -6
  8. package/public/index.html +17 -17
  9. package/src/App.vue +109 -109
  10. package/src/assets/icons/arrow_down.svg +3 -3
  11. package/src/assets/icons/arrow_up_red.svg +3 -3
  12. package/src/assets/icons/black_spinner.svg +35 -35
  13. package/src/assets/icons/delete_icon.svg +11 -11
  14. package/src/assets/icons/delete_icon_gray.svg +11 -11
  15. package/src/assets/icons/drag_icon.svg +8 -8
  16. package/src/assets/icons/external_icon.svg +6 -6
  17. package/src/assets/icons/language_icon.svg +6 -6
  18. package/src/assets/icons/pdf_icon.svg +6 -6
  19. package/src/assets/icons/plus_button.svg +4 -4
  20. package/src/assets/icons/search_icon_black.svg +3 -3
  21. package/src/assets/icons/subposition_icon.svg +3 -3
  22. package/src/assets/icons/subposition_marker.svg +3 -3
  23. package/src/assets/icons/warning_icon.svg +3 -3
  24. package/src/assets/svgIcons/2d_active.svg +7 -7
  25. package/src/assets/svgIcons/2d_inactive.svg +8 -8
  26. package/src/assets/svgIcons/3d_active.svg +7 -7
  27. package/src/assets/svgIcons/3d_inactive.svg +8 -8
  28. package/src/assets/svgIcons/_readme.md +7 -7
  29. package/src/assets/svgIcons/accept.svg +5 -5
  30. package/src/assets/svgIcons/activate_panels_active.svg +22 -22
  31. package/src/assets/svgIcons/activate_panels_inactive.svg +20 -20
  32. package/src/assets/svgIcons/add_icon-1.svg +3 -3
  33. package/src/assets/svgIcons/add_icon.svg +4 -4
  34. package/src/assets/svgIcons/address_book.svg +3 -3
  35. package/src/assets/svgIcons/after_sale_as_a_service.svg +6 -6
  36. package/src/assets/svgIcons/all_good.svg +3 -3
  37. package/src/assets/svgIcons/angle_active.svg +5 -5
  38. package/src/assets/svgIcons/angle_inactive.svg +4 -4
  39. package/src/assets/svgIcons/area_active.svg +11 -11
  40. package/src/assets/svgIcons/area_inactive.svg +26 -26
  41. package/src/assets/svgIcons/areas_tool.svg +14 -14
  42. package/src/assets/svgIcons/arrow_down.svg +3 -3
  43. package/src/assets/svgIcons/arrow_left.svg +4 -4
  44. package/src/assets/svgIcons/arrow_right.svg +4 -4
  45. package/src/assets/svgIcons/arrow_up.svg +3 -3
  46. package/src/assets/svgIcons/attachment.svg +3 -3
  47. package/src/assets/svgIcons/base_layer.svg +3 -3
  48. package/src/assets/svgIcons/battery.svg +3 -3
  49. package/src/assets/svgIcons/bell.svg +3 -3
  50. package/src/assets/svgIcons/bexio.svg +4 -4
  51. package/src/assets/svgIcons/bold.svg +3 -3
  52. package/src/assets/svgIcons/bom.svg +3 -3
  53. package/src/assets/svgIcons/bom_generation.svg +10 -10
  54. package/src/assets/svgIcons/bookmaker.svg +3 -3
  55. package/src/assets/svgIcons/bubble.svg +3 -3
  56. package/src/assets/svgIcons/bug.svg +5 -5
  57. package/src/assets/svgIcons/bullet_list.svg +8 -8
  58. package/src/assets/svgIcons/calendar.svg +7 -7
  59. package/src/assets/svgIcons/calendar_icon.svg +7 -7
  60. package/src/assets/svgIcons/call.svg +3 -3
  61. package/src/assets/svgIcons/camera.svg +3 -3
  62. package/src/assets/svgIcons/car.svg +3 -3
  63. package/src/assets/svgIcons/cart.svg +3 -3
  64. package/src/assets/svgIcons/charger_icon_white.svg +44 -44
  65. package/src/assets/svgIcons/checkbox.svg +3 -3
  66. package/src/assets/svgIcons/clear_formatting.svg +7 -7
  67. package/src/assets/svgIcons/clickable_info.svg +4 -4
  68. package/src/assets/svgIcons/clip.svg +3 -3
  69. package/src/assets/svgIcons/clock.svg +17 -17
  70. package/src/assets/svgIcons/clock_full.svg +3 -3
  71. package/src/assets/svgIcons/close_for_modals,_tool_tips.svg +4 -4
  72. package/src/assets/svgIcons/co_branding.svg +5 -5
  73. package/src/assets/svgIcons/collapse.svg +4 -4
  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/external_icon.svg +5 -5
  120. package/src/assets/svgIcons/fav_icon.svg +4 -4
  121. package/src/assets/svgIcons/finance.svg +3 -3
  122. package/src/assets/svgIcons/financing_for_pv-1.svg +5 -5
  123. package/src/assets/svgIcons/financing_for_pv-2.svg +3 -3
  124. package/src/assets/svgIcons/financing_for_pv.svg +6 -6
  125. package/src/assets/svgIcons/finish-1.svg +4 -4
  126. package/src/assets/svgIcons/finish.svg +3 -3
  127. package/src/assets/svgIcons/flatten.svg +11 -11
  128. package/src/assets/svgIcons/flatten_roof.svg +20 -20
  129. package/src/assets/svgIcons/folder.svg +3 -3
  130. package/src/assets/svgIcons/free_technology.svg +5 -5
  131. package/src/assets/svgIcons/handle.svg +5 -5
  132. package/src/assets/svgIcons/heat_calc.svg +7 -7
  133. package/src/assets/svgIcons/height_equalize.svg +3 -3
  134. package/src/assets/svgIcons/height_snap.svg +3 -3
  135. package/src/assets/svgIcons/house.svg +3 -3
  136. package/src/assets/svgIcons/house_3d-1.svg +7 -7
  137. package/src/assets/svgIcons/house_3d.svg +7 -7
  138. package/src/assets/svgIcons/inclination.svg +2 -2
  139. package/src/assets/svgIcons/info.svg +3 -3
  140. package/src/assets/svgIcons/initial_situation.svg +3 -3
  141. package/src/assets/svgIcons/integrations.svg +3 -3
  142. package/src/assets/svgIcons/intro-tour-1.svg +3 -3
  143. package/src/assets/svgIcons/intro-tour.svg +3 -3
  144. package/src/assets/svgIcons/inverter-1.svg +5 -5
  145. package/src/assets/svgIcons/inverter.svg +3 -3
  146. package/src/assets/svgIcons/italic.svg +3 -3
  147. package/src/assets/svgIcons/key.svg +3 -3
  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/lunch.svg +4 -4
  166. package/src/assets/svgIcons/magic_tool.svg +6 -6
  167. package/src/assets/svgIcons/map_icon.svg +5 -5
  168. package/src/assets/svgIcons/map_settings.svg +3 -3
  169. package/src/assets/svgIcons/margin_tool.svg +4 -4
  170. package/src/assets/svgIcons/meeting.svg +6 -6
  171. package/src/assets/svgIcons/move_copy.svg +4 -4
  172. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  173. package/src/assets/svgIcons/next.svg +4 -4
  174. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  175. package/src/assets/svgIcons/numbered_list.svg +6 -6
  176. package/src/assets/svgIcons/obstacle_tool.svg +9 -9
  177. package/src/assets/svgIcons/obstacle_tool_origin.svg +3 -3
  178. package/src/assets/svgIcons/offset_tool.svg +8 -8
  179. package/src/assets/svgIcons/outline_tool.svg +11 -11
  180. package/src/assets/svgIcons/pan_tool.svg +12 -12
  181. package/src/assets/svgIcons/panels_tool.svg +8 -8
  182. package/src/assets/svgIcons/pen_tool.svg +4 -4
  183. package/src/assets/svgIcons/picker_tool.svg +4 -4
  184. package/src/assets/svgIcons/picture.svg +3 -3
  185. package/src/assets/svgIcons/pin.svg +5 -5
  186. package/src/assets/svgIcons/presentation.svg +3 -3
  187. package/src/assets/svgIcons/previous.svg +4 -4
  188. package/src/assets/svgIcons/profile-1.svg +4 -4
  189. package/src/assets/svgIcons/profile.svg +4 -4
  190. package/src/assets/svgIcons/profitability.svg +3 -3
  191. package/src/assets/svgIcons/project_analysis.svg +4 -4
  192. package/src/assets/svgIcons/project_settings.svg +4 -4
  193. package/src/assets/svgIcons/pv.svg +3 -3
  194. package/src/assets/svgIcons/quotations.svg +6 -6
  195. package/src/assets/svgIcons/redo.svg +6 -6
  196. package/src/assets/svgIcons/resizer.svg +5 -5
  197. package/src/assets/svgIcons/roof_layer.svg +3 -3
  198. package/src/assets/svgIcons/rotate_tool.svg +3 -3
  199. package/src/assets/svgIcons/rotate_view.svg +5 -5
  200. package/src/assets/svgIcons/ruler_tool.svg +3 -3
  201. package/src/assets/svgIcons/run_simulation.svg +3 -3
  202. package/src/assets/svgIcons/save.svg +3 -3
  203. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  204. package/src/assets/svgIcons/search.svg +3 -3
  205. package/src/assets/svgIcons/security.svg +3 -3
  206. package/src/assets/svgIcons/settings.svg +3 -3
  207. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  208. package/src/assets/svgIcons/smartphone.svg +4 -4
  209. package/src/assets/svgIcons/solar_calc.svg +13 -13
  210. package/src/assets/svgIcons/sorting.svg +4 -4
  211. package/src/assets/svgIcons/split.svg +12 -12
  212. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  213. package/src/assets/svgIcons/strikethrough.svg +4 -4
  214. package/src/assets/svgIcons/subscriptions.svg +3 -3
  215. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  216. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  217. package/src/assets/svgIcons/subsidies.svg +3 -3
  218. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  219. package/src/assets/svgIcons/suitcase.svg +3 -3
  220. package/src/assets/svgIcons/summer.svg +3 -3
  221. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  222. package/src/assets/svgIcons/transfer.svg +4 -4
  223. package/src/assets/svgIcons/trim_tool.svg +4 -4
  224. package/src/assets/svgIcons/truck.svg +3 -3
  225. package/src/assets/svgIcons/underlined.svg +3 -3
  226. package/src/assets/svgIcons/undo.svg +6 -6
  227. package/src/assets/svgIcons/uparrow.svg +3 -3
  228. package/src/assets/svgIcons/update.svg +3 -3
  229. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  230. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  231. package/src/assets/svgIcons/upload_image.svg +8 -8
  232. package/src/assets/svgIcons/upload_image_tool.svg +7 -7
  233. package/src/assets/svgIcons/variants.svg +6 -6
  234. package/src/assets/svgIcons/vertical_tool.svg +3 -3
  235. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  236. package/src/assets/svgIcons/warning.svg +4 -4
  237. package/src/assets/svgIcons/way.svg +5 -5
  238. package/src/assets/svgIcons/wifi.svg +3 -3
  239. package/src/assets/svgIcons/winter.svg +3 -3
  240. package/src/assets/svgIcons/workflow_template.svg +11 -11
  241. package/src/assets/theme.js +41 -41
  242. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  243. package/src/components/addNewButton/index.vue +64 -64
  244. package/src/components/banner/actionBanner/index.vue +65 -65
  245. package/src/components/banner/banner/banner.stories.js +31 -31
  246. package/src/components/banner/banner/index.vue +188 -188
  247. package/src/components/banner/infoBanner/index.vue +69 -69
  248. package/src/components/buttons/buttonIcon/index.vue +142 -142
  249. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  250. package/src/components/buttons/closeButton/index.vue +61 -61
  251. package/src/components/buttons/mainButton/index.vue +140 -140
  252. package/src/components/card/index.vue +96 -96
  253. package/src/components/collapsableInfoText/index.vue +125 -125
  254. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  255. package/src/components/deleteIcon/index.vue +78 -78
  256. package/src/components/draggableInputHandle/index.vue +46 -46
  257. package/src/components/dropdown/Dropdown.stories.js +54 -54
  258. package/src/components/dropdown/index.vue +138 -138
  259. package/src/components/errorMessage/index.vue +64 -64
  260. package/src/components/filter/filterSettings.vue +633 -633
  261. package/src/components/filter/index.vue +154 -154
  262. package/src/components/filter/parentDropdown.vue +91 -91
  263. package/src/components/icon/Icons.stories.js +41 -41
  264. package/src/components/icon/iconCache.js +23 -23
  265. package/src/components/icon/iconCollection.vue +68 -68
  266. package/src/components/icon/index.vue +140 -140
  267. package/src/components/iconWrapper/index.vue +179 -179
  268. package/src/components/infoCard/index.vue +42 -42
  269. package/src/components/infoText/index.vue +165 -165
  270. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  271. package/src/components/inputs/checkbox/index.vue +214 -214
  272. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  273. package/src/components/inputs/inputNumber/index.vue +784 -789
  274. package/src/components/inputs/inputNumberQuestion/index.vue +215 -215
  275. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  276. package/src/components/inputs/inputText/index.vue +375 -375
  277. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  278. package/src/components/inputs/radioButton/index.vue +270 -270
  279. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  280. package/src/components/inputs/searchInput/index.vue +150 -150
  281. package/src/components/inputs/select/index.vue +1028 -907
  282. package/src/components/inputs/select/option/index.vue +139 -148
  283. package/src/components/inputs/select/select.stories.js +59 -59
  284. package/src/components/inputs/slider/index.vue +126 -126
  285. package/src/components/inputs/switchField/index.vue +256 -256
  286. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  287. package/src/components/inputs/textAreaInput/index.vue +200 -200
  288. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  289. package/src/components/inputs/toggle/index.vue +288 -288
  290. package/src/components/label/index.vue +99 -99
  291. package/src/components/markerItem/index.vue +86 -86
  292. package/src/components/modals/actionModal/index.vue +64 -64
  293. package/src/components/modals/infoModal/index.vue +49 -49
  294. package/src/components/modals/modal/index.vue +188 -188
  295. package/src/components/modals/modal/modal.stories.js +31 -31
  296. package/src/components/navigationTabs/index.vue +112 -112
  297. package/src/components/pageSubtitle/index.vue +61 -61
  298. package/src/components/pageTitle/index.vue +68 -68
  299. package/src/components/pagination/index.vue +145 -145
  300. package/src/components/progressBar/index.vue +125 -125
  301. package/src/components/projectMarker/index.vue +298 -298
  302. package/src/components/rangeSlider/Slider.vue +547 -547
  303. package/src/components/rangeSlider/index.vue +517 -517
  304. package/src/components/rangeSlider/utils/dom.js +49 -49
  305. package/src/components/rangeSlider/utils/fns.js +26 -26
  306. package/src/components/selectedOptions/index.vue +145 -145
  307. package/src/components/sideMenu/index.vue +270 -270
  308. package/src/components/spinner/index.vue +68 -68
  309. package/src/components/tableDropdown/index.vue +638 -638
  310. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  311. package/src/components/tables/mainTable/index.vue +493 -493
  312. package/src/components/tables/viewTable/index.vue +195 -195
  313. package/src/components/tabsHeader/index.vue +83 -83
  314. package/src/components/threeDots/index.vue +407 -407
  315. package/src/components/videoThumbnail/index.vue +103 -103
  316. package/src/components/videoThumbnail/videoThumbnail.stories.js +35 -35
  317. package/src/helpers/currencyMapping.js +28 -28
  318. package/src/helpers/numberConverter.js +103 -103
  319. package/src/helpers/translateLang.js +127 -127
  320. package/src/main.js +6 -6
  321. package/src/mixins/inputValidations.js +97 -97
  322. package/src/utils/index.js +0 -12
@@ -1,789 +1,784 @@
1
- <template>
2
- <container :inputWidth="inputWidth" :alignItems="alignItems">
3
- <label-slot-wrapper
4
- v-if="hasLabelSlot"
5
- :isInteractive="isInteractive"
6
- :alignItems="alignItems"
7
- :noBorder="noBorder"
8
- :isError="isError"
9
- :borderColor="borderColor"
10
- @mousedown="initInteraction"
11
- >
12
- <slot name="label"></slot>
13
- </label-slot-wrapper>
14
-
15
- <label-wrapper v-if="labelText">
16
- <label-text :labelFontColor="labelFontColor" :data-id="labelDataId">
17
- {{ labelText }}
18
- </label-text>
19
-
20
- <info-text
21
- v-if="labelInfoText"
22
- :text="labelInfoText"
23
- :alignArrow="labelInfoAlign"
24
- />
25
- </label-wrapper>
26
- <input-wrapper>
27
- <input-container
28
- v-bind="$attrs"
29
- ref="inputField1"
30
- :hasUnit="unitName && !!unitName.length"
31
- :placeholder="displayedPlaceholder"
32
- :isError="isError"
33
- :inputHeight="inputHeight"
34
- :minWidth="minWidth"
35
- :isInteractive="isInteractive"
36
- :value="formatWithCurrency(value)"
37
- @blur="onInputBlur($event)"
38
- @focus="focusInput()"
39
- @keyup.enter="onEnterPress"
40
- @input="onInput($event)"
41
- :disabled="disabled"
42
- :isDisabled="disabled"
43
- :alignItems="alignItems"
44
- :noBorder="noBorder"
45
- :borderColor="borderColor"
46
- :textAlign="textAlign"
47
- :fontSize="fontSize"
48
- :fontColor="fontColor"
49
- :backgroundColor="backgroundColor"
50
- :hasSlot="hasSlot"
51
- :hasLabelSlot="hasLabelSlot"
52
- :slotSize="slotSize"
53
- :showLinearUnitName="showLinearUnitName"
54
- :data-id="inputDataId"
55
- />
56
- <slot-container v-if="hasSlot" :slotSize="slotSize" :isError="isError">
57
- <slot></slot>
58
- </slot-container>
59
-
60
- <unit-container
61
- v-if="unitName && showLinearUnitName && !hasSlot"
62
- :hasLength="!!textInput.length"
63
- :isError="isError"
64
- >{{ unitName }}</unit-container
65
- >
66
- <icon-wrapper
67
- v-if="isError && !showLinearUnitName"
68
- size="16px"
69
- :marginRight="showSelect ? selectWidth : 0"
70
- >
71
- <icon name="warning" size="16px" cursor="default" />
72
- </icon-wrapper>
73
- <select-wrapper v-if="showSelect">
74
- <divider />
75
- <Select
76
- :showBorder="false"
77
- :selectWidth="`${selectWidth}px`"
78
- :disabled="isSelectDisabled"
79
- @input-change="$emit('select-change', $event)"
80
- >
81
- <template #selector>
82
- <select-text>{{ getSelectValue }}</select-text>
83
- </template>
84
- <template #dropdown>
85
- <Option
86
- v-for="item in selectOptions"
87
- :key="item.value"
88
- :value="item.value"
89
- >
90
- {{ item.label }}
91
- </Option>
92
- </template>
93
- </Select>
94
- </select-wrapper>
95
- </input-wrapper>
96
- <error-message v-if="isError">{{ errorMessage }}</error-message>
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 Select from '../select'
137
- import Option 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: 'input-number',
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
- Select,
358
- Option,
359
- SelectWrapper,
360
- SelectText,
361
- Divider
362
- },
363
- inheritAttrs: false,
364
- data() {
365
- return {
366
- textInput: '',
367
- isFocused: false,
368
- warningIcon: warningIcon
369
- }
370
- },
371
- props: {
372
- placeholder: {
373
- required: false,
374
- default: ''
375
- },
376
- isError: {
377
- required: false,
378
- default: false
379
- },
380
- inputWidth: {
381
- required: false,
382
- default: null
383
- },
384
- minWidth: {
385
- required: false,
386
- default: null
387
- },
388
- inputHeight: {
389
- required: false,
390
- default: '40px'
391
- },
392
- value: {
393
- required: true,
394
- default: null
395
- },
396
- clearInput: {
397
- required: false,
398
- default: false
399
- },
400
- alignItems: {
401
- required: false,
402
- default: 'vertical'
403
- },
404
- errorMessage: {
405
- required: false,
406
- default: 'Please insert a correct number'
407
- },
408
- numberPrecision: {
409
- required: false,
410
- default: 0
411
- },
412
- minDecimals: {
413
- required: false,
414
- default: 0
415
- },
416
- unitName: {
417
- required: false,
418
- default: ''
419
- },
420
- showLinearUnitName: {
421
- required: false,
422
- default: false
423
- },
424
- disabled: {
425
- required: false,
426
- default: false
427
- },
428
- noBorder: {
429
- required: false,
430
- default: false
431
- },
432
- borderColor: {
433
- required: false
434
- },
435
- textAlign: {
436
- required: false,
437
- default: 'left'
438
- },
439
- fontSize: {
440
- required: false,
441
- default: '13px'
442
- },
443
- isInteractive: {
444
- required: false,
445
- default: false
446
- },
447
- interactionStep: {
448
- required: false,
449
- default: 1
450
- },
451
- labelText: {
452
- required: false,
453
- default: null
454
- },
455
- labelInfoText: {
456
- required: false,
457
- default: null
458
- },
459
- labelInfoAlign: {
460
- required: false,
461
- default: 'left'
462
- },
463
- defaultNumber: {
464
- required: false,
465
- default: null
466
- },
467
- minNumber: {
468
- required: false,
469
- default: null
470
- },
471
- fontColor: {
472
- required: false,
473
- default: null
474
- },
475
- backgroundColor: {
476
- required: false,
477
- default: null
478
- },
479
- numberToStringEnabled: {
480
- required: false,
481
- default: true
482
- },
483
- allowNegative: {
484
- required: false,
485
- default: true
486
- },
487
- slotSize: {
488
- required: false
489
- },
490
- labelFontColor: {
491
- required: false,
492
- default: 'eturnityGrey'
493
- },
494
- focus: {
495
- required: false,
496
- default: false
497
- },
498
- labelDataId: {
499
- required: false,
500
- default: ''
501
- },
502
- inputDataId: {
503
- required: false,
504
- default: ''
505
- },
506
- showSelect: {
507
- type: Boolean,
508
- default: false
509
- },
510
- selectWidth: {
511
- type: Number,
512
- default: 70
513
- },
514
- selectOptions: {
515
- type: Array,
516
- default: () => []
517
- },
518
- selectValue: {
519
- type: [String, Number],
520
- default: null
521
- },
522
- isSelectDisabled: {
523
- type: Boolean,
524
- default: false
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
- methods: {
549
- onEnterPress() {
550
- this.$emit('on-enter-click')
551
- this.$refs.inputField1.$el.blur()
552
- },
553
- onChangeHandler(event) {
554
- if (isNaN(event) || event === '') {
555
- event = this.defaultNumber
556
- ? this.defaultNumber
557
- : this.minNumber || this.minNumber === 0
558
- ? this.minNumber
559
- : event
560
- }
561
- if (!this.allowNegative) {
562
- event = Math.abs(event)
563
- }
564
- event = parseFloat(event)
565
- // Need to return an integer rather than a string
566
- this.$emit('input-change', event)
567
- },
568
- onEvaluateCode(event) {
569
- // function to perform math on the code
570
- // filter the string in case of any malicious content
571
- const val = event.target.value
572
- let filtered = val.replace('(auto)', '').replace(/[^-()\d/*+.,]/g, '')
573
- filtered = filtered.split(/([-+*/()])/)
574
- let formatted = filtered.map((item) => {
575
- if (
576
- item === '+' ||
577
- item === '-' ||
578
- item === '*' ||
579
- item === '/' ||
580
- item === '(' ||
581
- item === ')' ||
582
- item === ''
583
- ) {
584
- return item
585
- } else {
586
- let num = stringToNumber({
587
- value: item,
588
- numberPrecision: false,
589
- minDecimals: this.minDecimals
590
- })
591
- return num
592
- }
593
- })
594
- let evaluated
595
- formatted = this.removeStringItemsAfterLastNumber(formatted)
596
- evaluated = eval(formatted.join(' '))
597
- if (typeof evaluated === 'string') {
598
- evaluated = stringToNumber({
599
- value: evaluated,
600
- numberPrecision: this.numberPrecision,
601
- minDecimals: this.minDecimals
602
- })
603
- } else if (typeof evaluated === 'number') {
604
- evaluated = evaluated.toFixed(this.numberPrecision)
605
- }
606
- return evaluated
607
- },
608
- removeStringItemsAfterLastNumber(array) {
609
- // fixed in EPDM-6487, in order to prevent 'Unexpected end of input'
610
- let lastNumberIndex = -1
611
- // Find the index of the last number in the array
612
- for (let i = array.length - 1; i >= 0; i--) {
613
- if (typeof array[i] === 'number') {
614
- lastNumberIndex = i
615
- break
616
- }
617
- }
618
- // if there are no numbers, return an empty array
619
- if (lastNumberIndex === -1) {
620
- return []
621
- }
622
- // Remove non-numeric items after the last number
623
- if (lastNumberIndex !== -1) {
624
- const newArray = array.slice(0, lastNumberIndex + 1)
625
- return newArray
626
- }
627
- return array
628
- },
629
- onInput(event) {
630
- if (!this.isFocused) {
631
- return
632
- }
633
- if (event.target.value === '') {
634
- this.$emit('on-input', '')
635
- }
636
- let evaluatedVal
637
- try {
638
- evaluatedVal = this.onEvaluateCode(event)
639
- } finally {
640
- if (evaluatedVal && this.value != evaluatedVal) {
641
- this.$emit('on-input', evaluatedVal)
642
- }
643
- }
644
- },
645
- onInputBlur(e) {
646
- this.isFocused = false
647
- let value = e.target.value
648
- let evaluatedInput = this.onEvaluateCode(e)
649
- this.onChangeHandler(evaluatedInput ? evaluatedInput : value)
650
- if ((evaluatedInput && value.length) || this.minNumber !== null) {
651
- this.textInput = numberToString({
652
- value:
653
- evaluatedInput && value.length
654
- ? evaluatedInput
655
- : this.defaultNumber
656
- ? this.defaultNumber
657
- : this.minNumber,
658
- numberPrecision: this.numberPrecision,
659
- minDecimals: this.minDecimals
660
- })
661
- }
662
- let adjustedMinValue =
663
- evaluatedInput && evaluatedInput.length
664
- ? evaluatedInput
665
- : this.defaultNumber
666
- ? this.defaultNumber
667
- : this.minNumber || this.minNumber === 0
668
- ? this.minNumber
669
- : ''
670
- this.$emit('input-blur', adjustedMinValue)
671
- },
672
- focusInput() {
673
- if (this.disabled) {
674
- return
675
- }
676
- this.isFocused = true
677
- this.$nextTick(() => {
678
- this.$refs.inputField1.$el.select()
679
- })
680
- this.$emit('input-focus')
681
- },
682
- blurInput() {
683
- if (this.disabled) {
684
- return
685
- }
686
- this.isFocused = false
687
- this.$nextTick(() => {
688
- this.$refs.inputField1.$el.blur()
689
- })
690
- },
691
- formatWithCurrency(value) {
692
- let adjustedMinValue =
693
- value || value === 0
694
- ? value
695
- : this.defaultNumber
696
- ? this.defaultNumber
697
- : this.minNumber || this.minNumber === 0
698
- ? this.minNumber
699
- : ''
700
- if ((adjustedMinValue || adjustedMinValue === 0) && !this.isFocused) {
701
- let input = this.numberToStringEnabled
702
- ? numberToString({
703
- value: adjustedMinValue,
704
- numberPrecision: this.numberPrecision,
705
- minDecimals: this.minDecimals
706
- })
707
- : adjustedMinValue
708
- let unit = this.showLinearUnitName ? '' : this.unitName
709
- //return input + ' ' + unit
710
- return input + ' ' + unit
711
- } else if (!adjustedMinValue && adjustedMinValue !== 0) {
712
- return ''
713
- } else {
714
- return this.numberToStringEnabled
715
- ? numberToString({
716
- value: adjustedMinValue,
717
- numberPrecision: this.numberPrecision,
718
- minDecimals: this.minDecimals
719
- })
720
- : adjustedMinValue
721
- }
722
- },
723
- initInteraction(e) {
724
- this.focusInput()
725
- e.preventDefault()
726
- window.addEventListener('mousemove', this.interact, false)
727
- window.addEventListener('mouseup', this.stopInteract, false)
728
- },
729
- interact(e) {
730
- e.preventDefault()
731
- let value = parseFloat(this.value || 0)
732
- value += parseFloat(this.interactionStep) * parseInt(e.movementX)
733
- this.$emit('on-input-drag', value)
734
-
735
- this.textInput = numberToString({
736
- value: value && value.length ? value : this.minNumber,
737
- numberPrecision: this.numberPrecision,
738
- minDecimals: this.minDecimals
739
- })
740
- //this.value=value
741
- },
742
- stopInteract(e) {
743
- e.preventDefault()
744
- window.removeEventListener('mousemove', this.interact, false)
745
- window.removeEventListener('mouseup', this.stopInteract, false)
746
- this.blurInput()
747
- }
748
- },
749
- created() {
750
- if (this.value) {
751
- this.textInput = numberToString({
752
- value: this.value,
753
- numberPrecision: this.numberPrecision,
754
- minDecimals: this.minDecimals
755
- })
756
- } else if (this.defaultNumber !== null) {
757
- this.textInput = numberToString({
758
- value: this.defaultNumber,
759
- numberPrecision: this.numberPrecision,
760
- minDecimals: this.minDecimals
761
- })
762
- } else if (this.minNumber !== null) {
763
- this.textInput = numberToString({
764
- value: this.minNumber,
765
- numberPrecision: this.numberPrecision,
766
- minDecimals: this.minDecimals
767
- })
768
- }
769
- },
770
- mounted() {
771
- if (this.focus) {
772
- this.focusInput()
773
- }
774
- },
775
- watch: {
776
- focus(value) {
777
- if (value) {
778
- this.focusInput()
779
- }
780
- },
781
- clearInput: function (value) {
782
- if (value) {
783
- // If the value is typed, then we should clear the textInput on Continue
784
- this.textInput = ''
785
- }
786
- }
787
- }
788
- }
789
- </script>
1
+ <template>
2
+ <container :inputWidth="inputWidth" :alignItems="alignItems">
3
+ <label-slot-wrapper
4
+ v-if="hasLabelSlot"
5
+ :isInteractive="isInteractive"
6
+ :alignItems="alignItems"
7
+ :noBorder="noBorder"
8
+ :isError="isError"
9
+ :borderColor="borderColor"
10
+ @mousedown="initInteraction"
11
+ >
12
+ <slot name="label"></slot>
13
+ </label-slot-wrapper>
14
+
15
+ <label-wrapper v-if="labelText">
16
+ <label-text :labelFontColor="labelFontColor" :data-id="labelDataId">
17
+ {{ labelText }}
18
+ </label-text>
19
+
20
+ <info-text
21
+ v-if="labelInfoText"
22
+ :text="labelInfoText"
23
+ :alignArrow="labelInfoAlign"
24
+ />
25
+ </label-wrapper>
26
+ <input-wrapper>
27
+ <input-container
28
+ v-bind="$attrs"
29
+ ref="inputField1"
30
+ :hasUnit="unitName && !!unitName.length"
31
+ :placeholder="displayedPlaceholder"
32
+ :isError="isError"
33
+ :inputHeight="inputHeight"
34
+ :minWidth="minWidth"
35
+ :isInteractive="isInteractive"
36
+ :value="formatWithCurrency(value)"
37
+ @blur="onInputBlur($event)"
38
+ @focus="focusInput()"
39
+ @keyup.enter="onEnterPress"
40
+ @input="onInput($event)"
41
+ :disabled="disabled"
42
+ :isDisabled="disabled"
43
+ :alignItems="alignItems"
44
+ :noBorder="noBorder"
45
+ :borderColor="borderColor"
46
+ :textAlign="textAlign"
47
+ :fontSize="fontSize"
48
+ :fontColor="fontColor"
49
+ :backgroundColor="backgroundColor"
50
+ :hasSlot="hasSlot"
51
+ :hasLabelSlot="hasLabelSlot"
52
+ :slotSize="slotSize"
53
+ :showLinearUnitName="showLinearUnitName"
54
+ :data-id="inputDataId"
55
+ />
56
+ <slot-container v-if="hasSlot" :slotSize="slotSize" :isError="isError">
57
+ <slot></slot>
58
+ </slot-container>
59
+
60
+ <unit-container
61
+ v-if="unitName && showLinearUnitName && !hasSlot"
62
+ :hasLength="!!textInput.length"
63
+ :isError="isError"
64
+ >{{ unitName }}</unit-container
65
+ >
66
+ <icon-wrapper
67
+ v-if="isError && !showLinearUnitName"
68
+ size="16px"
69
+ :marginRight="showSelect ? selectWidth : 0"
70
+ >
71
+ <icon name="warning" size="16px" cursor="default" />
72
+ </icon-wrapper>
73
+ <select-wrapper v-if="showSelect">
74
+ <divider />
75
+ <Select
76
+ :showBorder="false"
77
+ :selectWidth="`${selectWidth}px`"
78
+ @input-change="$emit('select-change', $event)"
79
+ >
80
+ <template #selector>
81
+ <select-text>{{ getSelectValue }}</select-text>
82
+ </template>
83
+ <template #dropdown>
84
+ <Option
85
+ v-for="item in selectOptions"
86
+ :key="item.value"
87
+ :value="item.value"
88
+ >
89
+ {{ item.label }}
90
+ </Option>
91
+ </template>
92
+ </Select>
93
+ </select-wrapper>
94
+ </input-wrapper>
95
+ <error-message v-if="isError">{{ errorMessage }}</error-message>
96
+ </container>
97
+ </template>
98
+
99
+ <script>
100
+ // import InputNumber from "@eturnity/eturnity_reusable_components/src/components/inputs/inputNumber"
101
+ //This component should be used for questions with input fields only
102
+ //How to use:
103
+ // <input-number
104
+ // placeholder="Enter distance"
105
+ // :isError="false" //default is false
106
+ // inputWidth="150px" //by default, this is 100%
107
+ // minWidth="100px"
108
+ // :numberPrecision="3"
109
+ // minDecimals="2"
110
+ // unitName="pc"
111
+ // :value="inputValue" //required -- String
112
+ // @input-change="onInputChange($event)" //required
113
+ // @on-enter-click="onInputSubmit()"
114
+ // :errorMessage="Enter a number between 1 and 10"
115
+ // :disabled="false"
116
+ // :noBorder="true"
117
+ // textAlign="left" // "left, right, center"
118
+ // :showLinearUnitName="true"
119
+ // fontSize="13px"
120
+ // labelText="Number of Modules"
121
+ // labelInfoText="Here is some information for you..."
122
+ // labelInfoAlign="left"
123
+ // :minNumber="0"
124
+ // fontColor="blue"
125
+ // >
126
+ //<template name=label><img>....</template>
127
+ //</inputNumber>
128
+ import styled from 'vue3-styled-components'
129
+ import {
130
+ stringToNumber,
131
+ numberToString
132
+ } from '../../../helpers/numberConverter'
133
+ import InfoText from '../../infoText'
134
+ import ErrorMessage from '../../errorMessage'
135
+ import Select from '../select'
136
+ import Option from '../select/option'
137
+ import warningIcon from '../../../assets/icons/error_icon.png'
138
+ import Icon from '../../icon'
139
+
140
+ const inputProps = {
141
+ isError: Boolean,
142
+ hasUnit: Boolean,
143
+ inputWidth: String,
144
+ minWidth: String,
145
+ isDisabled: Boolean,
146
+ noBorder: Boolean,
147
+ textAlign: String,
148
+ fontSize: String,
149
+ fontColor: String,
150
+ backgroundColor: String,
151
+ hasSlot: Boolean,
152
+ hasLabelSlot: Boolean,
153
+ slotSize: String,
154
+ inputHeight: String,
155
+ isInteractive: Boolean,
156
+ alignItems: String,
157
+ labelFontColor: String,
158
+ borderColor: String,
159
+ showLinearUnitName: Boolean
160
+ }
161
+
162
+ const Container = styled('div', inputProps)`
163
+ width: ${(props) => (props.inputWidth ? props.inputWidth : '100%')};
164
+ position: relative;
165
+ display: grid;
166
+ grid-template-columns: ${(props) =>
167
+ props.alignItems === 'vertical' ? '1fr' : 'auto 1fr'};
168
+ `
169
+
170
+ const InputContainer = styled('input', inputProps)`
171
+ border: ${(props) =>
172
+ props.isError
173
+ ? '1px solid ' + props.theme.colors.red
174
+ : props.noBorder
175
+ ? 'none'
176
+ : props.borderColor
177
+ ? props.theme.colors[props.borderColor]
178
+ ? '1px solid ' + props.theme.colors[props.borderColor]
179
+ : '1px solid ' + props.borderColor
180
+ : '1px solid ' + props.theme.colors.grey4};
181
+ height: ${(props) => props.inputHeight};
182
+ max-height: ${(props) => props.inputHeight};
183
+ padding: 0 10px;
184
+ padding-right: ${({ slotSize, isError, showLinearUnitName }) =>
185
+ slotSize
186
+ ? isError && !showLinearUnitName
187
+ ? 'calc(' + slotSize + ' + 24px)'
188
+ : 'calc(' + slotSize + ' + 10px)'
189
+ : isError && !showLinearUnitName
190
+ ? '24px'
191
+ : '5px'};
192
+ border-radius: ${(props) =>
193
+ props.isInteractive && props.alignItems != 'vertical'
194
+ ? '0 4px 4px 0'
195
+ : '4px'};
196
+ text-align: ${(props) => props.textAlign};
197
+ cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'auto')};
198
+ font-size: ${(props) => (props.fontSize ? props.fontSize : '13px')};
199
+ color: ${(props) =>
200
+ props.isError
201
+ ? props.theme.colors.grey6
202
+ : props.isDisabled
203
+ ? props.theme.colors.grey2
204
+ : props.fontColor
205
+ ? props.fontColor + ' !important'
206
+ : props.theme.colors.black};
207
+ background-color: ${(props) =>
208
+ props.backgroundColor
209
+ ? props.backgroundColor + ' !important'
210
+ : props.theme.colors.white};
211
+ width: ${(props) =>
212
+ props.inputWidth && !props.hasLabelSlot ? props.inputWidth : '100%'};
213
+ min-width: ${(props) => (props.minWidth ? props.minWidth : 'unset')};
214
+ background-color: ${(props) =>
215
+ props.isDisabled ? props.theme.colors.grey5 : '#fff'};
216
+ box-sizing: border-box;
217
+
218
+ &::placeholder {
219
+ color: ${(props) => props.theme.colors.grey2};
220
+ }
221
+
222
+ &:focus {
223
+ outline: none;
224
+ }
225
+ `
226
+
227
+ const InputWrapper = styled.span`
228
+ position: relative;
229
+ `
230
+
231
+ const UnitContainer = styled('span', inputProps)`
232
+ border-left: 1px solid
233
+ ${(props) =>
234
+ props.isError
235
+ ? props.theme.colors.red
236
+ : props.hasLength
237
+ ? props.theme.colors.black
238
+ : props.theme.colors.mediumGray};
239
+ position: absolute;
240
+ right: 10px;
241
+ top: 10px;
242
+ padding-left: 10px;
243
+ text-align: right;
244
+ color: ${(props) =>
245
+ props.isError
246
+ ? props.theme.colors.red
247
+ : props.hasLength
248
+ ? props.theme.colors.black
249
+ : props.theme.colors.mediumGray};
250
+ `
251
+
252
+ const SlotContainer = styled('span', inputProps)`
253
+ text-align: right;
254
+ border-left: 1px solid
255
+ ${(props) =>
256
+ props.isError
257
+ ? props.theme.colors.red
258
+ : props.hasLength
259
+ ? props.theme.colors.black
260
+ : props.theme.colors.mediumGray};
261
+ position: absolute;
262
+ width: ${(props) =>
263
+ props.slotSize ? 'calc(' + props.slotSize + ' - 10px)' : 'fit-content'};
264
+ right: 10px;
265
+ top: 10px;
266
+ padding-left: 10px;
267
+ color: ${(props) =>
268
+ props.isError
269
+ ? props.theme.colors.red
270
+ : props.hasLength
271
+ ? props.theme.colors.black
272
+ : props.theme.colors.mediumGray};
273
+ `
274
+
275
+ const LabelWrapper = styled('div', inputProps)`
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 10px;
279
+ margin-bottom: 8px;
280
+ cursor: ${(props) => (props.isInteractive ? 'ew-resize' : 'auto')};
281
+ `
282
+ const LabelSlotWrapper = styled('div', inputProps)`
283
+ display: flex;
284
+ gap: 10px;
285
+ align-items: center;
286
+ cursor: ${(props) => (props.isInteractive ? 'ew-resize' : 'auto')};
287
+ border: ${(props) =>
288
+ props.alignItems == 'vertical'
289
+ ? 'none'
290
+ : props.isError
291
+ ? '1px solid ' + props.theme.colors.red
292
+ : props.noBorder
293
+ ? 'none'
294
+ : props.borderColor
295
+ ? props.theme.colors[props.borderColor]
296
+ ? '1px solid ' + props.theme.colors[props.borderColor]
297
+ : '1px solid ' + props.borderColor
298
+ : '1px solid ' + props.theme.colors.grey4};
299
+ border-radius: 4px 0 0 4px;
300
+ border-right: none;
301
+ `
302
+
303
+ const LabelText = styled('div', inputProps)`
304
+ font-size: 13px;
305
+ color: ${(props) =>
306
+ props.theme.colors[props.labelFontColor]
307
+ ? props.theme.colors[props.labelFontColor]
308
+ : props.labelFontColor};
309
+ font-weight: 700;
310
+ `
311
+
312
+ const IconAttrs = { size: String, marginRight: Number }
313
+ const IconWrapper = styled('div', IconAttrs)`
314
+ position: absolute;
315
+ top: 0;
316
+ bottom: 0;
317
+ margin: auto;
318
+ right: ${(props) => props.marginRight + 10}px;
319
+ height: ${(props) => (props.size ? props.size : 'auto')};
320
+ `
321
+
322
+ const SelectText = styled.div`
323
+ font-size: 13px;
324
+ `
325
+
326
+ const SelectWrapper = styled.div`
327
+ position: absolute;
328
+ top: 2px;
329
+ right: 2px;
330
+ display: flex;
331
+ height: 100%;
332
+ `
333
+
334
+ const Divider = styled.div`
335
+ margin-top: 6px;
336
+ height: calc(100% - 16px);
337
+ width: 1px;
338
+ background-color: ${({ theme }) => theme.colors.grey4};
339
+ `
340
+
341
+ export default {
342
+ name: 'input-number',
343
+ components: {
344
+ Container,
345
+ InputContainer,
346
+ InputWrapper,
347
+ UnitContainer,
348
+ ErrorMessage,
349
+ LabelWrapper,
350
+ LabelSlotWrapper,
351
+ LabelText,
352
+ InfoText,
353
+ Icon,
354
+ SlotContainer,
355
+ IconWrapper,
356
+ Select,
357
+ Option,
358
+ SelectWrapper,
359
+ SelectText,
360
+ Divider
361
+ },
362
+ inheritAttrs: false,
363
+ data() {
364
+ return {
365
+ textInput: '',
366
+ isFocused: false,
367
+ warningIcon: warningIcon
368
+ }
369
+ },
370
+ props: {
371
+ placeholder: {
372
+ required: false,
373
+ default: ''
374
+ },
375
+ isError: {
376
+ required: false,
377
+ default: false
378
+ },
379
+ inputWidth: {
380
+ required: false,
381
+ default: null
382
+ },
383
+ minWidth: {
384
+ required: false,
385
+ default: null
386
+ },
387
+ inputHeight: {
388
+ required: false,
389
+ default: '40px'
390
+ },
391
+ value: {
392
+ required: true,
393
+ default: null
394
+ },
395
+ clearInput: {
396
+ required: false,
397
+ default: false
398
+ },
399
+ alignItems: {
400
+ required: false,
401
+ default: 'vertical'
402
+ },
403
+ errorMessage: {
404
+ required: false,
405
+ default: 'Please insert a correct number'
406
+ },
407
+ numberPrecision: {
408
+ required: false,
409
+ default: 0
410
+ },
411
+ minDecimals: {
412
+ required: false,
413
+ default: 0
414
+ },
415
+ unitName: {
416
+ required: false,
417
+ default: ''
418
+ },
419
+ showLinearUnitName: {
420
+ required: false,
421
+ default: false
422
+ },
423
+ disabled: {
424
+ required: false,
425
+ default: false
426
+ },
427
+ noBorder: {
428
+ required: false,
429
+ default: false
430
+ },
431
+ borderColor: {
432
+ required: false
433
+ },
434
+ textAlign: {
435
+ required: false,
436
+ default: 'left'
437
+ },
438
+ fontSize: {
439
+ required: false,
440
+ default: '13px'
441
+ },
442
+ isInteractive: {
443
+ required: false,
444
+ default: false
445
+ },
446
+ interactionStep: {
447
+ required: false,
448
+ default: 1
449
+ },
450
+ labelText: {
451
+ required: false,
452
+ default: null
453
+ },
454
+ labelInfoText: {
455
+ required: false,
456
+ default: null
457
+ },
458
+ labelInfoAlign: {
459
+ required: false,
460
+ default: 'left'
461
+ },
462
+ defaultNumber: {
463
+ required: false,
464
+ default: null
465
+ },
466
+ minNumber: {
467
+ required: false,
468
+ default: null
469
+ },
470
+ fontColor: {
471
+ required: false,
472
+ default: null
473
+ },
474
+ backgroundColor: {
475
+ required: false,
476
+ default: null
477
+ },
478
+ numberToStringEnabled: {
479
+ required: false,
480
+ default: true
481
+ },
482
+ allowNegative: {
483
+ required: false,
484
+ default: true
485
+ },
486
+ slotSize: {
487
+ required: false
488
+ },
489
+ labelFontColor: {
490
+ required: false,
491
+ default: 'eturnityGrey'
492
+ },
493
+ focus: {
494
+ required: false,
495
+ default: false
496
+ },
497
+ labelDataId: {
498
+ required: false,
499
+ default: ''
500
+ },
501
+ inputDataId: {
502
+ required: false,
503
+ default: ''
504
+ },
505
+ showSelect: {
506
+ type: Boolean,
507
+ default: false
508
+ },
509
+ selectWidth: {
510
+ type: Number,
511
+ default: 70
512
+ },
513
+ selectOptions: {
514
+ type: Array,
515
+ default: () => []
516
+ },
517
+ selectValue: {
518
+ type: [String, Number],
519
+ default: null
520
+ }
521
+ },
522
+ computed: {
523
+ displayedPlaceholder() {
524
+ if (this.placeholder) return this.placeholder
525
+ if (this.defaultNumber)
526
+ return `${this.defaultNumber} ${this.unitName ? this.unitName : ''}`
527
+ return `${this.minNumber || 0} ${this.unitName ? this.unitName : ''}`
528
+ },
529
+ hasSlot() {
530
+ return !!this.$slots.default
531
+ },
532
+ hasLabelSlot() {
533
+ return !!this.$slots.label
534
+ },
535
+ getSelectValue() {
536
+ const item = this.selectOptions.find(
537
+ ({ value }) => value === this.selectValue
538
+ )
539
+
540
+ return item ? item.label : '-'
541
+ }
542
+ },
543
+ methods: {
544
+ onEnterPress() {
545
+ this.$emit('on-enter-click')
546
+ this.$refs.inputField1.$el.blur()
547
+ },
548
+ onChangeHandler(event) {
549
+ if (isNaN(event) || event === '') {
550
+ event = this.defaultNumber
551
+ ? this.defaultNumber
552
+ : this.minNumber || this.minNumber === 0
553
+ ? this.minNumber
554
+ : event
555
+ }
556
+ if (!this.allowNegative) {
557
+ event = Math.abs(event)
558
+ }
559
+ event = parseFloat(event)
560
+ // Need to return an integer rather than a string
561
+ this.$emit('input-change', event)
562
+ },
563
+ onEvaluateCode(event) {
564
+ // function to perform math on the code
565
+ // filter the string in case of any malicious content
566
+ const val = event.target.value
567
+ let filtered = val.replace('(auto)', '').replace(/[^-()\d/*+.,]/g, '')
568
+ filtered = filtered.split(/([-+*/()])/)
569
+ let formatted = filtered.map((item) => {
570
+ if (
571
+ item === '+' ||
572
+ item === '-' ||
573
+ item === '*' ||
574
+ item === '/' ||
575
+ item === '(' ||
576
+ item === ')' ||
577
+ item === ''
578
+ ) {
579
+ return item
580
+ } else {
581
+ let num = stringToNumber({
582
+ value: item,
583
+ numberPrecision: false,
584
+ minDecimals: this.minDecimals
585
+ })
586
+ return num
587
+ }
588
+ })
589
+ let evaluated
590
+ formatted = this.removeStringItemsAfterLastNumber(formatted)
591
+ evaluated = eval(formatted.join(' '))
592
+ if (typeof evaluated === 'string') {
593
+ evaluated = stringToNumber({
594
+ value: evaluated,
595
+ numberPrecision: this.numberPrecision,
596
+ minDecimals: this.minDecimals
597
+ })
598
+ } else if (typeof evaluated === 'number') {
599
+ evaluated = evaluated.toFixed(this.numberPrecision)
600
+ }
601
+ return evaluated
602
+ },
603
+ removeStringItemsAfterLastNumber(array) {
604
+ // fixed in EPDM-6487, in order to prevent 'Unexpected end of input'
605
+ let lastNumberIndex = -1
606
+ // Find the index of the last number in the array
607
+ for (let i = array.length - 1; i >= 0; i--) {
608
+ if (typeof array[i] === 'number') {
609
+ lastNumberIndex = i
610
+ break
611
+ }
612
+ }
613
+ // if there are no numbers, return an empty array
614
+ if (lastNumberIndex === -1) {
615
+ return []
616
+ }
617
+ // Remove non-numeric items after the last number
618
+ if (lastNumberIndex !== -1) {
619
+ const newArray = array.slice(0, lastNumberIndex + 1)
620
+ return newArray
621
+ }
622
+ return array
623
+ },
624
+ onInput(event) {
625
+ if (!this.isFocused) {
626
+ return
627
+ }
628
+ if (event.target.value === '') {
629
+ this.$emit('on-input', '')
630
+ }
631
+ let evaluatedVal
632
+ try {
633
+ evaluatedVal = this.onEvaluateCode(event)
634
+ } finally {
635
+ if (evaluatedVal && this.value != evaluatedVal) {
636
+ this.$emit('on-input', evaluatedVal)
637
+ }
638
+ }
639
+ },
640
+ onInputBlur(e) {
641
+ this.isFocused = false
642
+ let value = e.target.value
643
+ let evaluatedInput = this.onEvaluateCode(e)
644
+ this.onChangeHandler(evaluatedInput ? evaluatedInput : value)
645
+ if ((evaluatedInput && value.length) || this.minNumber !== null) {
646
+ this.textInput = numberToString({
647
+ value:
648
+ evaluatedInput && value.length
649
+ ? evaluatedInput
650
+ : this.defaultNumber
651
+ ? this.defaultNumber
652
+ : this.minNumber,
653
+ numberPrecision: this.numberPrecision,
654
+ minDecimals: this.minDecimals
655
+ })
656
+ }
657
+ let adjustedMinValue =
658
+ evaluatedInput && evaluatedInput.length
659
+ ? evaluatedInput
660
+ : this.defaultNumber
661
+ ? this.defaultNumber
662
+ : this.minNumber || this.minNumber === 0
663
+ ? this.minNumber
664
+ : ''
665
+ this.$emit('input-blur', adjustedMinValue)
666
+ },
667
+ focusInput() {
668
+ if (this.disabled) {
669
+ return
670
+ }
671
+ this.isFocused = true
672
+ this.$nextTick(() => {
673
+ this.$refs.inputField1.$el.select()
674
+ })
675
+ this.$emit('input-focus')
676
+ },
677
+ blurInput() {
678
+ if (this.disabled) {
679
+ return
680
+ }
681
+ this.isFocused = false
682
+ this.$nextTick(() => {
683
+ this.$refs.inputField1.$el.blur()
684
+ })
685
+ },
686
+ formatWithCurrency(value) {
687
+ let adjustedMinValue =
688
+ value || value === 0
689
+ ? value
690
+ : this.defaultNumber
691
+ ? this.defaultNumber
692
+ : this.minNumber || this.minNumber === 0
693
+ ? this.minNumber
694
+ : ''
695
+ if ((adjustedMinValue || adjustedMinValue === 0) && !this.isFocused) {
696
+ let input = this.numberToStringEnabled
697
+ ? numberToString({
698
+ value: adjustedMinValue,
699
+ numberPrecision: this.numberPrecision,
700
+ minDecimals: this.minDecimals
701
+ })
702
+ : adjustedMinValue
703
+ let unit = this.showLinearUnitName ? '' : this.unitName
704
+ //return input + ' ' + unit
705
+ return input + ' ' + unit
706
+ } else if (!adjustedMinValue && adjustedMinValue !== 0) {
707
+ return ''
708
+ } else {
709
+ return this.numberToStringEnabled
710
+ ? numberToString({
711
+ value: adjustedMinValue,
712
+ numberPrecision: this.numberPrecision,
713
+ minDecimals: this.minDecimals
714
+ })
715
+ : adjustedMinValue
716
+ }
717
+ },
718
+ initInteraction(e) {
719
+ this.focusInput()
720
+ e.preventDefault()
721
+ window.addEventListener('mousemove', this.interact, false)
722
+ window.addEventListener('mouseup', this.stopInteract, false)
723
+ },
724
+ interact(e) {
725
+ e.preventDefault()
726
+ let value = parseFloat(this.value || 0)
727
+ value += parseFloat(this.interactionStep) * parseInt(e.movementX)
728
+ this.$emit('on-input-drag', value)
729
+
730
+ this.textInput = numberToString({
731
+ value: value && value.length ? value : this.minNumber,
732
+ numberPrecision: this.numberPrecision,
733
+ minDecimals: this.minDecimals
734
+ })
735
+ //this.value=value
736
+ },
737
+ stopInteract(e) {
738
+ e.preventDefault()
739
+ window.removeEventListener('mousemove', this.interact, false)
740
+ window.removeEventListener('mouseup', this.stopInteract, false)
741
+ this.blurInput()
742
+ }
743
+ },
744
+ created() {
745
+ if (this.value) {
746
+ this.textInput = numberToString({
747
+ value: this.value,
748
+ numberPrecision: this.numberPrecision,
749
+ minDecimals: this.minDecimals
750
+ })
751
+ } else if (this.defaultNumber !== null) {
752
+ this.textInput = numberToString({
753
+ value: this.defaultNumber,
754
+ numberPrecision: this.numberPrecision,
755
+ minDecimals: this.minDecimals
756
+ })
757
+ } else if (this.minNumber !== null) {
758
+ this.textInput = numberToString({
759
+ value: this.minNumber,
760
+ numberPrecision: this.numberPrecision,
761
+ minDecimals: this.minDecimals
762
+ })
763
+ }
764
+ },
765
+ mounted() {
766
+ if (this.focus) {
767
+ this.focusInput()
768
+ }
769
+ },
770
+ watch: {
771
+ focus(value) {
772
+ if (value) {
773
+ this.focusInput()
774
+ }
775
+ },
776
+ clearInput: function (value) {
777
+ if (value) {
778
+ // If the value is typed, then we should clear the textInput on Continue
779
+ this.textInput = ''
780
+ }
781
+ }
782
+ }
783
+ }
784
+ </script>