@eturnity/eturnity_reusable_components 7.24.3-EPDM-8441.0 → 7.24.3-EPDM-11143.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) 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/copy.svg +10 -0
  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 -64
  245. package/src/components/banner/actionBanner/index.vue +65 -65
  246. package/src/components/banner/banner/banner.stories.js +31 -31
  247. package/src/components/banner/banner/index.vue +188 -188
  248. package/src/components/banner/infoBanner/index.vue +69 -69
  249. package/src/components/buttons/buttonIcon/index.vue +142 -142
  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 -140
  253. package/src/components/card/index.vue +96 -96
  254. package/src/components/collapsableInfoText/index.vue +125 -125
  255. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  256. package/src/components/deleteIcon/index.vue +78 -78
  257. package/src/components/draggableInputHandle/index.vue +46 -46
  258. package/src/components/dropdown/Dropdown.stories.js +54 -54
  259. package/src/components/dropdown/index.vue +138 -138
  260. package/src/components/errorMessage/index.vue +64 -64
  261. package/src/components/filter/filterSettings.vue +633 -633
  262. package/src/components/filter/index.vue +154 -154
  263. package/src/components/filter/parentDropdown.vue +91 -91
  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 -68
  267. package/src/components/icon/index.vue +139 -139
  268. package/src/components/iconWrapper/index.vue +179 -179
  269. package/src/components/infoCard/index.vue +35 -35
  270. package/src/components/infoText/index.vue +160 -160
  271. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  272. package/src/components/inputs/checkbox/index.vue +214 -214
  273. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  274. package/src/components/inputs/inputNumber/index.vue +710 -710
  275. package/src/components/inputs/inputNumberQuestion/index.vue +215 -215
  276. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  277. package/src/components/inputs/inputText/index.vue +375 -392
  278. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  279. package/src/components/inputs/radioButton/index.vue +270 -270
  280. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  281. package/src/components/inputs/searchInput/index.vue +150 -150
  282. package/src/components/inputs/select/index.vue +885 -996
  283. package/src/components/inputs/select/option/index.vue +148 -144
  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 -256
  287. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  288. package/src/components/inputs/textAreaInput/index.vue +200 -200
  289. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  290. package/src/components/inputs/toggle/index.vue +288 -288
  291. package/src/components/label/index.vue +99 -99
  292. package/src/components/markerItem/index.vue +86 -86
  293. package/src/components/modals/actionModal/index.vue +64 -64
  294. package/src/components/modals/infoModal/index.vue +49 -49
  295. package/src/components/modals/modal/index.vue +188 -188
  296. package/src/components/modals/modal/modal.stories.js +31 -31
  297. package/src/components/navigationTabs/index.vue +112 -112
  298. package/src/components/pageSubtitle/index.vue +61 -61
  299. package/src/components/pageTitle/index.vue +68 -68
  300. package/src/components/pagination/index.vue +145 -145
  301. package/src/components/progressBar/index.vue +125 -125
  302. package/src/components/projectMarker/index.vue +298 -298
  303. package/src/components/rangeSlider/Slider.vue +547 -547
  304. package/src/components/rangeSlider/index.vue +517 -517
  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 -270
  309. package/src/components/spinner/index.vue +68 -68
  310. package/src/components/tableDropdown/index.vue +638 -638
  311. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  312. package/src/components/tables/mainTable/index.vue +447 -447
  313. package/src/components/tables/viewTable/index.vue +195 -195
  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
@@ -1,710 +1,710 @@
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>
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>