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