@eturnity/eturnity_reusable_components 1.2.25-EPDM-5202.2 → 1.2.26-3d-master.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 (231) 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 +63 -63
  7. package/public/index.html +17 -17
  8. package/src/App.vue +376 -321
  9. package/src/assets/icons/arrow_down.svg +3 -3
  10. package/src/assets/icons/arrow_up_red.svg +3 -3
  11. package/src/assets/icons/black_spinner.svg +35 -35
  12. package/src/assets/icons/delete_icon.svg +11 -11
  13. package/src/assets/icons/delete_icon_gray.svg +11 -11
  14. package/src/assets/icons/drag_icon.svg +8 -8
  15. package/src/assets/icons/error_icon copy.png +0 -0
  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/accept.svg +5 -5
  29. package/src/assets/svgIcons/activate_panels_active.svg +22 -22
  30. package/src/assets/svgIcons/activate_panels_inactive.svg +20 -20
  31. package/src/assets/svgIcons/add_icon-1.svg +3 -3
  32. package/src/assets/svgIcons/add_icon.svg +4 -4
  33. package/src/assets/svgIcons/address_book.svg +3 -3
  34. package/src/assets/svgIcons/after_sale_as_a_service.svg +6 -6
  35. package/src/assets/svgIcons/all_good.svg +3 -3
  36. package/src/assets/svgIcons/angle_active.svg +5 -5
  37. package/src/assets/svgIcons/angle_inactive.svg +4 -4
  38. package/src/assets/svgIcons/area_active.svg +11 -11
  39. package/src/assets/svgIcons/area_inactive.svg +26 -26
  40. package/src/assets/svgIcons/arrow_down.svg +3 -3
  41. package/src/assets/svgIcons/arrow_left.svg +4 -4
  42. package/src/assets/svgIcons/arrow_right.svg +4 -4
  43. package/src/assets/svgIcons/arrow_up.svg +3 -3
  44. package/src/assets/svgIcons/attachment.svg +3 -3
  45. package/src/assets/svgIcons/base_layer.svg +3 -0
  46. package/src/assets/svgIcons/battery.svg +3 -3
  47. package/src/assets/svgIcons/bell.svg +3 -3
  48. package/src/assets/svgIcons/bold.svg +3 -3
  49. package/src/assets/svgIcons/bom.svg +3 -3
  50. package/src/assets/svgIcons/bom_generation.svg +10 -10
  51. package/src/assets/svgIcons/bookmaker.svg +3 -3
  52. package/src/assets/svgIcons/bubble.svg +3 -3
  53. package/src/assets/svgIcons/bullet_list.svg +8 -8
  54. package/src/assets/svgIcons/calendar.svg +7 -7
  55. package/src/assets/svgIcons/calendar_icon.svg +7 -7
  56. package/src/assets/svgIcons/call.svg +3 -3
  57. package/src/assets/svgIcons/camera.svg +3 -3
  58. package/src/assets/svgIcons/car.svg +3 -3
  59. package/src/assets/svgIcons/cart.svg +3 -3
  60. package/src/assets/svgIcons/checkbox.svg +3 -3
  61. package/src/assets/svgIcons/clear_formatting.svg +7 -7
  62. package/src/assets/svgIcons/clickable_info.svg +4 -4
  63. package/src/assets/svgIcons/clip.svg +3 -3
  64. package/src/assets/svgIcons/clock.svg +4 -4
  65. package/src/assets/svgIcons/close_for_modals,_tool_tips.svg +4 -4
  66. package/src/assets/svgIcons/collapse.svg +4 -4
  67. package/src/assets/svgIcons/component_library.svg +7 -7
  68. package/src/assets/svgIcons/context_menu-1.svg +6 -6
  69. package/src/assets/svgIcons/context_menu-2.svg +5 -5
  70. package/src/assets/svgIcons/context_menu.svg +5 -5
  71. package/src/assets/svgIcons/context_menu_tabs.svg +5 -5
  72. package/src/assets/svgIcons/cross.svg +4 -4
  73. package/src/assets/svgIcons/current_variant.svg +4 -4
  74. package/src/assets/svgIcons/deadline.svg +4 -4
  75. package/src/assets/svgIcons/delete.svg +4 -4
  76. package/src/assets/svgIcons/delete_area_active.svg +16 -16
  77. package/src/assets/svgIcons/delete_area_inactive.svg +15 -15
  78. package/src/assets/svgIcons/direction_active-1.svg +12 -12
  79. package/src/assets/svgIcons/direction_active.svg +5 -5
  80. package/src/assets/svgIcons/direction_inactive.svg +4 -4
  81. package/src/assets/svgIcons/distances_active.svg +9 -9
  82. package/src/assets/svgIcons/distances_inactive.svg +8 -8
  83. package/src/assets/svgIcons/document.svg +3 -3
  84. package/src/assets/svgIcons/downarrow.svg +3 -3
  85. package/src/assets/svgIcons/download.svg +4 -4
  86. package/src/assets/svgIcons/draggable_corner.svg +5 -0
  87. package/src/assets/svgIcons/duplicate-1.svg +8 -8
  88. package/src/assets/svgIcons/duplicate-2.svg +5 -5
  89. package/src/assets/svgIcons/duplicate.svg +4 -4
  90. package/src/assets/svgIcons/e-mobility_configurator.svg +6 -6
  91. package/src/assets/svgIcons/edit_button.svg +3 -3
  92. package/src/assets/svgIcons/email.svg +3 -3
  93. package/src/assets/svgIcons/ems-1.svg +3 -3
  94. package/src/assets/svgIcons/ems.svg +3 -3
  95. package/src/assets/svgIcons/end_of_the_list.svg +5 -5
  96. package/src/assets/svgIcons/erase.svg +4 -4
  97. package/src/assets/svgIcons/fav_icon.svg +4 -4
  98. package/src/assets/svgIcons/financing_for_pv-1.svg +5 -5
  99. package/src/assets/svgIcons/financing_for_pv-2.svg +3 -3
  100. package/src/assets/svgIcons/financing_for_pv.svg +6 -6
  101. package/src/assets/svgIcons/finish-1.svg +4 -4
  102. package/src/assets/svgIcons/finish.svg +3 -3
  103. package/src/assets/svgIcons/folder.svg +3 -3
  104. package/src/assets/svgIcons/heat_calc.svg +7 -7
  105. package/src/assets/svgIcons/house.svg +3 -3
  106. package/src/assets/svgIcons/info.svg +3 -3
  107. package/src/assets/svgIcons/initial_situation.svg +3 -3
  108. package/src/assets/svgIcons/intro-tour-1.svg +3 -3
  109. package/src/assets/svgIcons/intro-tour.svg +3 -3
  110. package/src/assets/svgIcons/inverter-1.svg +5 -5
  111. package/src/assets/svgIcons/inverter.svg +3 -3
  112. package/src/assets/svgIcons/italic.svg +3 -3
  113. package/src/assets/svgIcons/key.svg +3 -3
  114. package/src/assets/svgIcons/lead_marketplace.svg +6 -6
  115. package/src/assets/svgIcons/lead_provider.svg +4 -4
  116. package/src/assets/svgIcons/length_in_2d_active.svg +12 -12
  117. package/src/assets/svgIcons/length_in_2d_inctive.svg +13 -13
  118. package/src/assets/svgIcons/light_bulb.svg +3 -3
  119. package/src/assets/svgIcons/line_graph.svg +3 -3
  120. package/src/assets/svgIcons/local_subsidies.svg +18 -18
  121. package/src/assets/svgIcons/location.svg +3 -3
  122. package/src/assets/svgIcons/lock.svg +3 -3
  123. package/src/assets/svgIcons/loop.svg +3 -3
  124. package/src/assets/svgIcons/lunch.svg +4 -4
  125. package/src/assets/svgIcons/magic_tool.svg +6 -0
  126. package/src/assets/svgIcons/map_icon.svg +5 -3
  127. package/src/assets/svgIcons/margin_tool.svg +6 -0
  128. package/src/assets/svgIcons/meeting.svg +6 -6
  129. package/src/assets/svgIcons/move_copy.svg +4 -4
  130. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  131. package/src/assets/svgIcons/next.svg +4 -4
  132. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  133. package/src/assets/svgIcons/numbered_list.svg +6 -6
  134. package/src/assets/svgIcons/obstacle_tool.svg +9 -13
  135. package/src/assets/svgIcons/outline_tool.svg +11 -0
  136. package/src/assets/svgIcons/pan_tool.svg +12 -12
  137. package/src/assets/svgIcons/panels_tool.svg +8 -8
  138. package/src/assets/svgIcons/pen_tool.svg +4 -4
  139. package/src/assets/svgIcons/picker_tool.svg +4 -4
  140. package/src/assets/svgIcons/picture.svg +3 -3
  141. package/src/assets/svgIcons/pin.svg +5 -5
  142. package/src/assets/svgIcons/presentation.svg +3 -3
  143. package/src/assets/svgIcons/previous.svg +4 -4
  144. package/src/assets/svgIcons/profile-1.svg +4 -4
  145. package/src/assets/svgIcons/profile.svg +4 -4
  146. package/src/assets/svgIcons/profitability.svg +3 -3
  147. package/src/assets/svgIcons/project_analysis.svg +4 -4
  148. package/src/assets/svgIcons/project_settings.svg +4 -4
  149. package/src/assets/svgIcons/pv.svg +3 -3
  150. package/src/assets/svgIcons/quotations.svg +6 -6
  151. package/src/assets/svgIcons/redo.svg +6 -0
  152. package/src/assets/svgIcons/resizer.svg +5 -0
  153. package/src/assets/svgIcons/roof_layer.svg +3 -0
  154. package/src/assets/svgIcons/rotate_view.svg +5 -5
  155. package/src/assets/svgIcons/run_simulation.svg +3 -3
  156. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  157. package/src/assets/svgIcons/search.svg +3 -3
  158. package/src/assets/svgIcons/security.svg +3 -3
  159. package/src/assets/svgIcons/settings.svg +3 -3
  160. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  161. package/src/assets/svgIcons/smartphone.svg +4 -4
  162. package/src/assets/svgIcons/solar_calc.svg +13 -13
  163. package/src/assets/svgIcons/sorting.svg +4 -4
  164. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  165. package/src/assets/svgIcons/strikethrough.svg +4 -4
  166. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  167. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  168. package/src/assets/svgIcons/subsidies.svg +3 -3
  169. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  170. package/src/assets/svgIcons/suitcase.svg +3 -3
  171. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  172. package/src/assets/svgIcons/transfer.svg +4 -4
  173. package/src/assets/svgIcons/truck.svg +3 -3
  174. package/src/assets/svgIcons/underlined.svg +3 -3
  175. package/src/assets/svgIcons/undo.svg +6 -0
  176. package/src/assets/svgIcons/uparrow.svg +3 -3
  177. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  178. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  179. package/src/assets/svgIcons/upload_image.svg +8 -8
  180. package/src/assets/svgIcons/vertical_tool.svg +3 -0
  181. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  182. package/src/assets/svgIcons/warning.svg +4 -4
  183. package/src/assets/svgIcons/way.svg +5 -5
  184. package/src/assets/svgIcons/wifi.svg +3 -3
  185. package/src/assets/svgIcons/winter.svg +3 -3
  186. package/src/assets/theme.js +36 -34
  187. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  188. package/src/components/addNewButton/index.vue +58 -58
  189. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  190. package/src/components/buttons/closeButton/index.vue +61 -61
  191. package/src/components/buttons/externalButton/index.vue +101 -101
  192. package/src/components/buttons/mainButton/index.vue +82 -82
  193. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  194. package/src/components/deleteIcon/index.vue +55 -55
  195. package/src/components/errorMessage/index.vue +62 -0
  196. package/src/components/icon/Icons.stories.js +41 -41
  197. package/src/components/icon/iconCollection.vue +68 -68
  198. package/src/components/icon/index.vue +84 -83
  199. package/src/components/iconWrapper/index.vue +116 -0
  200. package/src/components/infoText/index.vue +166 -151
  201. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  202. package/src/components/inputs/checkbox/index.vue +182 -182
  203. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  204. package/src/components/inputs/inputNumber/index.vue +557 -390
  205. package/src/components/inputs/inputNumberQuestion/index.vue +215 -215
  206. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  207. package/src/components/inputs/inputText/index.vue +258 -253
  208. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  209. package/src/components/inputs/radioButton/index.vue +246 -246
  210. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  211. package/src/components/inputs/searchInput/index.vue +97 -97
  212. package/src/components/inputs/slider/index.vue +126 -126
  213. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +135 -135
  214. package/src/components/inputs/textAreaInput/index.vue +194 -189
  215. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  216. package/src/components/inputs/toggle/index.vue +288 -288
  217. package/src/components/modals/modal/index.vue +153 -153
  218. package/src/components/modals/modal/modal.stories.js +31 -31
  219. package/src/components/pageSubtitle/index.vue +68 -68
  220. package/src/components/pageTitle/index.vue +45 -45
  221. package/src/components/progressBar/index.vue +125 -125
  222. package/src/components/projectMarker/index.vue +285 -285
  223. package/src/components/spinner/index.vue +71 -71
  224. package/src/components/tableDropdown/index.vue +644 -644
  225. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  226. package/src/components/tables/mainTable/index.vue +379 -379
  227. package/src/components/tables/viewTable/index.vue +195 -195
  228. package/src/components/threeDots/index.vue +333 -333
  229. package/src/helpers/numberConverter.js +103 -98
  230. package/src/helpers/translateLang.js +80 -80
  231. package/src/main.js +13 -13
@@ -1,390 +1,557 @@
1
- <template>
2
- <container>
3
- <label-wrapper v-if="labelText">
4
- <label-text>
5
- {{ labelText }}
6
- </label-text>
7
- <info-text
8
- v-if="labelInfoText"
9
- :text="labelInfoText"
10
- borderColor="#ccc"
11
- size="13"
12
- :alignText="labelInfoAlign"
13
- />
14
- </label-wrapper>
15
- <input-wrapper>
16
- <input-container
17
- ref="inputField1"
18
- :hasUnit="unitName && !!unitName.length"
19
- :placeholder="placeholder"
20
- :isError="isError"
21
- :inputWidth="inputWidth"
22
- :minWidth="minWidth"
23
- :value="formatWithCurrency(value)"
24
- @blur="onInputBlur($event)"
25
- @focus="focusInput()"
26
- @keyup.enter="$emit('on-enter-click')"
27
- :disabled="disabled"
28
- :isDisabled="disabled"
29
- :noBorder="noBorder"
30
- :textAlign="textAlign"
31
- :fontSize="fontSize"
32
- :fontColor="fontColor"
33
- />
34
- <unit-container
35
- v-if="unitName && showLinearUnitName"
36
- :hasLength="!!textInput.length"
37
- :isError="isError"
38
- >{{ unitName }}</unit-container
39
- >
40
- </input-wrapper>
41
- <error-message v-if="isError">{{ errorMessage }}</error-message>
42
- </container>
43
- </template>
44
-
45
- <script>
46
- // import InputNumber from "@eturnity/eturnity_reusable_components/src/components/inputs/inputNumber"
47
- //This component should be used for questions with input fields only
48
- //How to use:
49
- // <input-number
50
- // placeholder="Enter distance"
51
- // :isError="false" //default is false
52
- // inputWidth="150px" //by default, this is 100%
53
- // minWidth="100px"
54
- // :numberPrecision="3"
55
- // unitName="pc"
56
- // :value="inputValue" //required -- String
57
- // @input-change="onInputChange($event)" //required
58
- // @on-enter-click="onInputSubmit()"
59
- // :errorMessage="Enter a number between 1 and 10"
60
- // :disabled="false"
61
- // :noBorder="true"
62
- // textAlign="left" // "left, right, center"
63
- // :showLinearUnitName="true"
64
- // fontSize="13px"
65
- // labelText="Number of Modules"
66
- // labelInfoText="Here is some information for you..."
67
- // labelInfoAlign="left"
68
- // :minNumber="0"
69
- // fontColor="blue"
70
- // />
71
- import styled from 'vue-styled-components'
72
- import {
73
- stringToNumber,
74
- numberToString
75
- } from '../../../helpers/numberConverter'
76
- import InfoText from '../../infoText'
77
-
78
- const Container = styled.div`
79
- width: 100%;
80
- position: relative;
81
- `
82
-
83
- const inputProps = {
84
- isError: Boolean,
85
- hasUnit: Boolean,
86
- inputWidth: String,
87
- minWidth: String,
88
- isDisabled: Boolean,
89
- noBorder: Boolean,
90
- textAlign: String,
91
- fontSize: String,
92
- fontColor: String
93
- }
94
- const InputContainer = styled('input', inputProps)`
95
- border: ${(props) =>
96
- props.isError
97
- ? '1px solid ' + props.theme.colors.red
98
- : props.noBorder
99
- ? 'none'
100
- : '1px solid ' + props.theme.colors.mediumGray};
101
- padding: ${(props) =>
102
- props.hasUnit ? '11px 40px 11px 10px' : '11px 5px 11px 10px'};
103
- border-radius: 4px;
104
- text-align: ${(props) => props.textAlign};
105
- cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'auto')};
106
- font-size: ${(props) => (props.fontSize ? props.fontSize : '13px')};
107
- color: ${(props) =>
108
- props.isError
109
- ? props.theme.colors.red
110
- : props.fontColor
111
- ? props.fontColor + ' !important'
112
- : props.theme.colors.black};
113
- width: ${(props) => (props.inputWidth ? props.inputWidth : '100%')};
114
- min-width: ${(props) => (props.minWidth ? props.minWidth : 'unset')};
115
- background-color: ${(props) =>
116
- props.isDisabled ? props.theme.colors.grey5 : '#fff'};
117
- box-sizing: border-box;
118
-
119
- &::placeholder {
120
- color: ${(props) =>
121
- props.isError ? props.theme.colors.red : props.theme.colors.darkGray};
122
- }
123
-
124
- &:focus {
125
- outline: none;
126
- }
127
- `
128
-
129
- const InputWrapper = styled.span`
130
- position: relative;
131
- `
132
-
133
- const UnitContainer = styled('span', inputProps)`
134
- border-left: 1px solid
135
- ${(props) =>
136
- props.isError
137
- ? props.theme.colors.red
138
- : props.hasLength
139
- ? props.theme.colors.black
140
- : props.theme.colors.mediumGray};
141
- position: absolute;
142
- right: 10px;
143
- top: 0;
144
- padding-left: 10px;
145
- color: ${(props) =>
146
- props.isError
147
- ? props.theme.colors.red
148
- : props.hasLength
149
- ? props.theme.colors.black
150
- : props.theme.colors.mediumGray};
151
- `
152
-
153
- const ErrorMessage = styled.div`
154
- font-size: 14px;
155
- color: ${(props) => props.theme.colors.red};
156
- position: absolute;
157
- top: calc(100% + 1px);
158
- `
159
-
160
- const LabelWrapper = styled.div`
161
- display: flex;
162
- gap: 10px;
163
- margin-bottom: 8px;
164
- `
165
-
166
- const LabelText = styled.div`
167
- font-weight: bold;
168
- font-size: 13px;
169
- `
170
-
171
- export default {
172
- name: 'input-number',
173
- components: {
174
- Container,
175
- InputContainer,
176
- InputWrapper,
177
- UnitContainer,
178
- ErrorMessage,
179
- LabelWrapper,
180
- LabelText,
181
- InfoText
182
- },
183
- data() {
184
- return {
185
- textInput: '',
186
- isFocused: false
187
- }
188
- },
189
- props: {
190
- placeholder: {
191
- required: false,
192
- default: ''
193
- },
194
- isError: {
195
- required: false,
196
- default: false
197
- },
198
- inputWidth: {
199
- required: false,
200
- default: null
201
- },
202
- minWidth: {
203
- required: false,
204
- default: null
205
- },
206
- value: {
207
- required: true,
208
- default: null
209
- },
210
- clearInput: {
211
- required: false,
212
- default: false
213
- },
214
- errorMessage: {
215
- required: false,
216
- default: 'Please insert a correct number'
217
- },
218
- numberPrecision: {
219
- required: false,
220
- default: 0
221
- },
222
- unitName: {
223
- required: false,
224
- default: ''
225
- },
226
- showLinearUnitName: {
227
- required: false,
228
- default: false
229
- },
230
- disabled: {
231
- required: false,
232
- default: false
233
- },
234
- noBorder: {
235
- required: false,
236
- default: false
237
- },
238
- textAlign: {
239
- required: false,
240
- default: 'left'
241
- },
242
- fontSize: {
243
- required: false,
244
- default: '13px'
245
- },
246
- labelText: {
247
- required: false,
248
- default: null
249
- },
250
- labelInfoText: {
251
- required: false,
252
- default: null
253
- },
254
- labelInfoAlign: {
255
- required: false,
256
- default: 'right'
257
- },
258
- minNumber: {
259
- required: false,
260
- default: null
261
- },
262
- fontColor: {
263
- required: false,
264
- default: null
265
- },
266
- numberToStringEnabled: {
267
- required: false,
268
- default: true
269
- }
270
- },
271
- methods: {
272
- onChangeHandler(event) {
273
- if (isNaN(event)) {
274
- event = this.minNumber || this.minNumber === 0 ? this.minNumber : event
275
- }
276
- this.$emit('input-change', event)
277
- },
278
- onEvaluateCode(val) {
279
- // function to perform math on the code
280
- // filter the string in case of any malicious content
281
- let filtered = val.replace(/[^-()\d/*+.,]/g, '')
282
- filtered = filtered.split(/([-+*/()])/)
283
- let formatted = filtered.map((item) => {
284
- if (
285
- item === '+' ||
286
- item === '-' ||
287
- item === '*' ||
288
- item === '/' ||
289
- item === '(' ||
290
- item === ')' ||
291
- item === ''
292
- ) {
293
- return item
294
- } else {
295
- let num = stringToNumber({
296
- value: item,
297
- numberPrecision: false
298
- })
299
- return num
300
- }
301
- })
302
- let evaluated = eval(formatted.join(''))
303
- if (typeof evaluated === 'string') {
304
- evaluated = stringToNumber({
305
- value: evaluated,
306
- numberPrecision: this.numberPrecision
307
- })
308
- }
309
- return evaluated
310
- },
311
- onInputBlur(e) {
312
- this.isFocused = false
313
- let value = e.target.value
314
- let evaluatedInput = this.onEvaluateCode(value)
315
- this.onChangeHandler(evaluatedInput ? evaluatedInput : value)
316
- if ((evaluatedInput && value.length) || this.minNumber !== null) {
317
- this.textInput = numberToString({
318
- value:
319
- evaluatedInput && value.length ? evaluatedInput : this.minNumber,
320
- numberPrecision: this.numberPrecision
321
- })
322
- }
323
- let adjustedMinValue =
324
- value && value.length
325
- ? value
326
- : this.minNumber || this.minNumber === 0
327
- ? this.minNumber
328
- : ''
329
- this.$emit('input-blur', adjustedMinValue)
330
- },
331
- focusInput() {
332
- if (this.disabled) {
333
- return
334
- }
335
- this.isFocused = true
336
- this.$nextTick(() => {
337
- this.$refs.inputField1.$el.select()
338
- })
339
- },
340
- formatWithCurrency(value) {
341
- let adjustedMinValue =
342
- value || value === 0
343
- ? value
344
- : this.minNumber || this.minNumber === 0
345
- ? this.minNumber
346
- : ''
347
- if ((adjustedMinValue || adjustedMinValue === 0) && !this.isFocused) {
348
- let input = this.numberToStringEnabled
349
- ? numberToString({
350
- value: adjustedMinValue,
351
- numberPrecision: this.numberPrecision
352
- })
353
- : adjustedMinValue
354
- let unit = this.showLinearUnitName ? '' : this.unitName
355
- return input + ' ' + unit
356
- } else if (!adjustedMinValue && adjustedMinValue !== 0) {
357
- return ''
358
- } else {
359
- return this.numberToStringEnabled
360
- ? numberToString({
361
- value: adjustedMinValue,
362
- numberPrecision: this.numberPrecision
363
- })
364
- : adjustedMinValue
365
- }
366
- }
367
- },
368
- created() {
369
- if (this.value) {
370
- this.textInput = numberToString({
371
- value: this.value,
372
- numberPrecision: this.numberPrecision
373
- })
374
- } else if (this.minNumber !== null) {
375
- this.textInput = numberToString({
376
- value: this.minNumber,
377
- numberPrecision: this.numberPrecision
378
- })
379
- }
380
- },
381
- watch: {
382
- clearInput: function (value) {
383
- if (value) {
384
- // If the value is typed, then we should clear the textInput on Continue
385
- this.textInput = ''
386
- }
387
- }
388
- }
389
- }
390
- </script>
1
+ <template>
2
+ <container :inputWidth="inputWidth" :alignItems="alignItems">
3
+ <label-slot-wrapper v-if="hasLabelSlot" :isInteractive="isInteractive" @mousedown="initInteraction">
4
+
5
+ <slot name="label"></slot>
6
+ </label-slot-wrapper>
7
+
8
+ <label-wrapper v-if="labelText">
9
+ <label-text>
10
+ {{ labelText }}
11
+ </label-text>
12
+ <info-text
13
+ v-if="labelInfoText"
14
+ :text="labelInfoText"
15
+ borderColor="#ccc"
16
+ size="14px"
17
+ :alignText="labelInfoAlign"
18
+ />
19
+ </label-wrapper>
20
+ <input-wrapper>
21
+ <input-container
22
+ v-bind="$attrs"
23
+ ref="inputField1"
24
+ :hasUnit="unitName && !!unitName.length"
25
+ :placeholder="displayedPlaceholder"
26
+ :isError="isError"
27
+ :inputWidth="inputWidth"
28
+ :inputHeight="inputHeight"
29
+ :minWidth="minWidth"
30
+ :value="formatWithCurrency(value)"
31
+ @blur="onInputBlur($event)"
32
+ @focus="focusInput()"
33
+ @keyup.enter="$emit('on-enter-click')"
34
+ @input="onInput($event)"
35
+ :disabled="disabled"
36
+ :isDisabled="disabled"
37
+ :noBorder="noBorder"
38
+ :textAlign="textAlign"
39
+ :fontSize="fontSize"
40
+ :fontColor="fontColor"
41
+ :backgroundColor="backgroundColor"
42
+ v-on="$listeners"
43
+ :hasSlot="hasSlot"
44
+ :slotSize="slotSize"
45
+ />
46
+ <slot-container v-if="hasSlot" :slotSize="slotSize" :isError="isError">
47
+ <slot></slot>
48
+ </slot-container>
49
+
50
+ <unit-container
51
+ v-if="unitName && showLinearUnitName && !hasSlot"
52
+ :hasLength="!!textInput.length"
53
+ :isError="isError"
54
+ >{{ unitName }}</unit-container
55
+ >
56
+ <icon
57
+ v-if="(isError || inputIcon) && !showLinearUnitName"
58
+ :class="inputIconImageClass"
59
+ :src="isError ? warningIcon : inputIconImage"
60
+ />
61
+ </input-wrapper>
62
+ <error-message v-if="isError">{{ errorMessage }}</error-message>
63
+ </container>
64
+ </template>
65
+
66
+ <script>
67
+ // import InputNumber from "@eturnity/eturnity_reusable_components/src/components/inputs/inputNumber"
68
+ //This component should be used for questions with input fields only
69
+ //How to use:
70
+ // <input-number
71
+ // placeholder="Enter distance"
72
+ // :isError="false" //default is false
73
+ // inputWidth="150px" //by default, this is 100%
74
+ // minWidth="100px"
75
+ // :numberPrecision="3"
76
+ // unitName="pc"
77
+ // :value="inputValue" //required -- String
78
+ // @input-change="onInputChange($event)" //required
79
+ // @on-enter-click="onInputSubmit()"
80
+ // :errorMessage="Enter a number between 1 and 10"
81
+ // :disabled="false"
82
+ // :noBorder="true"
83
+ // textAlign="left" // "left, right, center"
84
+ // :showLinearUnitName="true"
85
+ // fontSize="13px"
86
+ // labelText="Number of Modules"
87
+ // labelInfoText="Here is some information for you..."
88
+ // labelInfoAlign="left"
89
+ // :minNumber="0"
90
+ // fontColor="blue"
91
+ // />
92
+ import styled from 'vue-styled-components'
93
+ import {
94
+ stringToNumber,
95
+ numberToString
96
+ } from '../../../helpers/numberConverter'
97
+ import InfoText from '../../infoText'
98
+ import ErrorMessage from '../../errorMessage'
99
+ import warningIcon from '../../../assets/icons/error_icon.png'
100
+
101
+ const inputProps = {
102
+ isError: Boolean,
103
+ hasUnit: Boolean,
104
+ inputWidth: String,
105
+ minWidth: String,
106
+ isDisabled: Boolean,
107
+ noBorder: Boolean,
108
+ textAlign: String,
109
+ fontSize: String,
110
+ fontColor: String,
111
+ backgroundColor:String,
112
+ hasSlot: Boolean,
113
+ slotSize: String,
114
+ inputHeight:String,
115
+ isInteractive:Boolean,
116
+ alignItems:String
117
+ }
118
+
119
+ const Container = styled('div', inputProps)`
120
+ width: ${(props) => (props.inputWidth ? props.inputWidth : '100%')};
121
+ position: relative;
122
+ display:grid;
123
+ grid-template-columns: ${(props) =>
124
+ props.alignItems === "vertical" ? "1fr" : "auto 1fr"};
125
+ `
126
+
127
+ const InputContainer = styled('input', inputProps)`
128
+ border: ${(props) =>
129
+ props.isError
130
+ ? '1px solid ' + props.theme.colors.red
131
+ : props.noBorder
132
+ ? 'none'
133
+ : '1px solid ' + props.theme.colors.mediumGray};
134
+ padding-top: 11px;
135
+ padding-bottom: 11px;
136
+ padding-left: 10px;
137
+ padding-right: ${(props) =>
138
+ props.slotSize
139
+ ? 'calc(' + props.slotSize + ' + 10px)'
140
+ : '5px'};
141
+ border-radius: 4px;
142
+ text-align: ${(props) => props.textAlign};
143
+ cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'auto')};
144
+ font-size: ${(props) => (props.fontSize ? props.fontSize : '13px')};
145
+ color: ${(props) =>
146
+ props.isError
147
+ ? props.theme.colors.red
148
+ : props.fontColor
149
+ ? props.fontColor + ' !important'
150
+ : props.theme.colors.black};
151
+ background-color:${(props) => props.backgroundColor
152
+ ? props.backgroundColor+' !important'
153
+ : props.theme.colors.white};
154
+ width: ${(props) => (props.inputWidth ? props.inputWidth : '100%')};
155
+ min-width: ${(props) => (props.minWidth ? props.minWidth : 'unset')};
156
+ background-color: ${(props) =>
157
+ props.isDisabled ? props.theme.colors.grey5 : '#fff'};
158
+ box-sizing: border-box;
159
+ max-height: ${(props) => (props.inputHeight)};
160
+ &::placeholder {
161
+ color: ${(props) =>
162
+ props.isError ? props.theme.colors.red : props.theme.colors.darkGray};
163
+ }
164
+
165
+ &:focus {
166
+ outline: none;
167
+ }
168
+ `
169
+ const IconProps = {
170
+ inputIconHeight: String
171
+ }
172
+
173
+ const Icon = styled('img', IconProps)`
174
+ position: absolute;
175
+ right: 10px;
176
+ top: 2px;
177
+ `
178
+
179
+ const InputWrapper = styled.span`
180
+ position: relative;
181
+ `
182
+
183
+ const UnitContainer = styled('span', inputProps)`
184
+ border-left: 1px solid
185
+ ${(props) =>
186
+ props.isError
187
+ ? props.theme.colors.red
188
+ : props.hasLength
189
+ ? props.theme.colors.black
190
+ : props.theme.colors.mediumGray};
191
+ position: absolute;
192
+ right: 10px;
193
+ top: 0;
194
+ padding-left: 10px;
195
+ text-align: right;
196
+ color: ${(props) =>
197
+ props.isError
198
+ ? props.theme.colors.red
199
+ : props.hasLength
200
+ ? props.theme.colors.black
201
+ : props.theme.colors.mediumGray};
202
+ `
203
+
204
+ const SlotContainer = styled('span', inputProps)`
205
+ text-align: right;
206
+ border-left: 1px solid
207
+ ${(props) =>
208
+ props.isError
209
+ ? props.theme.colors.red
210
+ : props.hasLength
211
+ ? props.theme.colors.black
212
+ : props.theme.colors.mediumGray};
213
+ position: absolute;
214
+ width: ${(props) =>
215
+ props.slotSize ? 'calc(' + props.slotSize + ' - 10px)' : 'fit-content'};
216
+ right: 10px;
217
+ top: 0;
218
+ padding-left: 10px;
219
+ color: ${(props) =>
220
+ props.isError
221
+ ? props.theme.colors.red
222
+ : props.hasLength
223
+ ? props.theme.colors.black
224
+ : props.theme.colors.mediumGray};
225
+ `
226
+
227
+ const LabelWrapper = styled('div',inputProps)`
228
+ display: flex;
229
+ gap: 10px;
230
+ margin-bottom: 8px;
231
+ cursor: ${(props) => (props.isInteractive?'ew-resize':'auto')};
232
+ `
233
+ const LabelSlotWrapper = styled('div',inputProps)`
234
+ display: flex;
235
+ gap: 10px;
236
+ align-items:center;
237
+ cursor: ${(props) => (props.isInteractive?'ew-resize':'auto')};
238
+ `
239
+
240
+ const LabelText = styled.div`
241
+ font-weight: bold;
242
+ font-size: 13px;
243
+ `
244
+
245
+ export default {
246
+ name: 'input-number',
247
+ components: {
248
+ Container,
249
+ InputContainer,
250
+ InputWrapper,
251
+ UnitContainer,
252
+ ErrorMessage,
253
+ LabelWrapper,
254
+ LabelSlotWrapper,
255
+ LabelText,
256
+ InfoText,
257
+ Icon,
258
+ SlotContainer,
259
+ },
260
+ inheritAttrs: false,
261
+ data() {
262
+ return {
263
+ textInput: '',
264
+ isFocused: false,
265
+ warningIcon: warningIcon,
266
+ }
267
+ },
268
+ props: {
269
+ placeholder: {
270
+ required: false,
271
+ default: ''
272
+ },
273
+ isError: {
274
+ required: false,
275
+ default: false
276
+ },
277
+ inputWidth: {
278
+ required: false,
279
+ default: null
280
+ },
281
+ minWidth: {
282
+ required: false,
283
+ default: null
284
+ },
285
+ inputHeight:{
286
+ required:false,
287
+ default:null
288
+ },
289
+ value: {
290
+ required: true,
291
+ default: null
292
+ },
293
+ clearInput: {
294
+ required: false,
295
+ default: false
296
+ },
297
+ alignItems: {
298
+ required: false,
299
+ default: "vertical",
300
+ },
301
+ errorMessage: {
302
+ required: false,
303
+ default: 'Please insert a correct number'
304
+ },
305
+ numberPrecision: {
306
+ required: false,
307
+ default: 0
308
+ },
309
+ unitName: {
310
+ required: false,
311
+ default: ''
312
+ },
313
+ showLinearUnitName: {
314
+ required: false,
315
+ default: false
316
+ },
317
+ disabled: {
318
+ required: false,
319
+ default: false
320
+ },
321
+ noBorder: {
322
+ required: false,
323
+ default: false
324
+ },
325
+ textAlign: {
326
+ required: false,
327
+ default: 'left'
328
+ },
329
+ fontSize: {
330
+ required: false,
331
+ default: '13px'
332
+ },
333
+ isInteractive: {
334
+ required: false,
335
+ default: false
336
+ },
337
+ interactionStep:{
338
+ required:false,
339
+ default:1
340
+ },
341
+ labelText: {
342
+ required: false,
343
+ default: null
344
+ },
345
+ labelInfoText: {
346
+ required: false,
347
+ default: null
348
+ },
349
+ labelInfoAlign: {
350
+ required: false,
351
+ default: 'left'
352
+ },
353
+ minNumber: {
354
+ required: false,
355
+ default: null
356
+ },
357
+ fontColor: {
358
+ required: false,
359
+ default: null
360
+ },
361
+ backgroundColor: {
362
+ required: false,
363
+ default: null
364
+ },
365
+ numberToStringEnabled: {
366
+ required: false,
367
+ default: true
368
+ },
369
+ inputIcon: {
370
+ require: false,
371
+ type: Boolean,
372
+ default: false
373
+ },
374
+ inputIconImage: {
375
+ require: false,
376
+ type: String,
377
+ default: ''
378
+ },
379
+ inputIconImageClass: {
380
+ require: false,
381
+ type: Array,
382
+ default: () => []
383
+ },
384
+ slotSize: {
385
+ required: false
386
+ }
387
+ },
388
+ computed: {
389
+ displayedPlaceholder() {
390
+ if (this.placeholder) return this.placeholder
391
+ return `${this.minNumber || 0} ${this.unitName ? this.unitName : ''}`
392
+ },
393
+ hasSlot() {
394
+ return !!this.$slots.default
395
+ },
396
+ hasLabelSlot(){
397
+ return !!this.$slots.label
398
+ },
399
+ computedSlotSize() {
400
+ return this.slotSize || this.$slots['default'][0].elm.clientWidth
401
+ }
402
+ },
403
+ methods: {
404
+ onChangeHandler(event) {
405
+ if (isNaN(event) || event=="") {
406
+ event = this.minNumber || this.minNumber === 0 ? this.minNumber : event
407
+ }
408
+ this.$emit('input-change', event)
409
+ },
410
+ onEvaluateCode(val) {
411
+ // function to perform math on the code
412
+ // filter the string in case of any malicious content
413
+ let filtered = val.replace(/[^-()\d/*+.,]/g, '')
414
+ filtered = filtered.split(/([-+*/()])/)
415
+ let formatted = filtered.map((item) => {
416
+ if (
417
+ item === '+' ||
418
+ item === '-' ||
419
+ item === '*' ||
420
+ item === '/' ||
421
+ item === '(' ||
422
+ item === ')' ||
423
+ item === ''
424
+ ) {
425
+ return item
426
+ } else {
427
+ let num = stringToNumber({
428
+ value: item,
429
+ numberPrecision: false
430
+ })
431
+ return num
432
+ }
433
+ })
434
+ let evaluated = eval(formatted.join(''))
435
+ if (typeof evaluated === 'string') {
436
+ evaluated = stringToNumber({
437
+ value: evaluated,
438
+ numberPrecision: this.numberPrecision
439
+ })
440
+ }else if(typeof evaluated === 'number'){
441
+ evaluated=evaluated.toFixed(this.numberPrecision)
442
+ }
443
+ return evaluated
444
+ },
445
+ onInput(value){
446
+ let evaluatedInput = this.onEvaluateCode(value)
447
+ this.$emit('on-input',evaluatedInput)
448
+ },
449
+ onInputBlur(e) {
450
+ this.isFocused = false
451
+ let value = e.target.value
452
+ let evaluatedInput = this.onEvaluateCode(value)
453
+ this.onChangeHandler(evaluatedInput ? evaluatedInput : value)
454
+ if ((evaluatedInput && value.length) || this.minNumber !== null) {
455
+ this.textInput = numberToString({
456
+ value:
457
+ evaluatedInput && value.length ? evaluatedInput : this.minNumber,
458
+ numberPrecision: this.numberPrecision
459
+ })
460
+ }
461
+ let adjustedMinValue =
462
+ evaluatedInput && evaluatedInput.length
463
+ ? evaluatedInput
464
+ : this.minNumber || this.minNumber === 0
465
+ ? this.minNumber
466
+ : ''
467
+ this.$emit('input-blur', adjustedMinValue)
468
+ },
469
+ focusInput() {
470
+ if (this.disabled) {
471
+ return
472
+ }
473
+ this.isFocused = true
474
+ this.$nextTick(() => {
475
+ this.$refs.inputField1.$el.select()
476
+ })
477
+ this.$emit('input-focus')
478
+ },
479
+ formatWithCurrency(value) {
480
+ let adjustedMinValue =
481
+ value || value === 0
482
+ ? value
483
+ : this.minNumber || this.minNumber === 0
484
+ ? this.minNumber
485
+ : ''
486
+ if ((adjustedMinValue || adjustedMinValue === 0) && !this.isFocused) {
487
+ let input = this.numberToStringEnabled
488
+ ? numberToString({
489
+ value: adjustedMinValue,
490
+ numberPrecision: this.numberPrecision
491
+ })
492
+ : adjustedMinValue
493
+ let unit = this.showLinearUnitName ? '' : this.unitName
494
+ //return input + ' ' + unit
495
+ return input + ' ' + unit
496
+ } else if (!adjustedMinValue && adjustedMinValue !== 0) {
497
+ return ''
498
+ } else {
499
+ return this.numberToStringEnabled
500
+ ? numberToString({
501
+ value: adjustedMinValue,
502
+ numberPrecision: this.numberPrecision
503
+ })
504
+ : adjustedMinValue
505
+ }
506
+ },
507
+ initInteraction(e) {
508
+ console.log('InitInteract')
509
+ window.addEventListener('mousemove', this.interact, false);
510
+ window.addEventListener('mouseup', this.stopInteract, false);
511
+ e.preventDefault()
512
+ },
513
+ interact(e) {
514
+ e.preventDefault()
515
+
516
+ let value=parseInt(this.value)
517
+
518
+ value+=this.parseInt(this.interactionStep)*parseInt(e.movementX)
519
+ this.$emit('on-input',value)
520
+
521
+ console.log('interact',this.value,value)
522
+ this.textInput=numberToString({
523
+ value:
524
+ value && value.length ? value : this.minNumber,
525
+ numberPrecision: this.numberPrecision
526
+ })
527
+ //this.value=value
528
+ },
529
+ stopInteract(e) {
530
+ e.preventDefault()
531
+ window.removeEventListener('mousemove', this.interact, false);
532
+ window.removeEventListener('mouseup', this.stopInteract, false);
533
+ },
534
+ },
535
+ created() {
536
+ if (this.value) {
537
+ this.textInput = numberToString({
538
+ value: this.value,
539
+ numberPrecision: this.numberPrecision
540
+ })
541
+ } else if (this.minNumber !== null) {
542
+ this.textInput = numberToString({
543
+ value: this.minNumber,
544
+ numberPrecision: this.numberPrecision
545
+ })
546
+ }
547
+ },
548
+ watch: {
549
+ clearInput: function (value) {
550
+ if (value) {
551
+ // If the value is typed, then we should clear the textInput on Continue
552
+ this.textInput = ''
553
+ }
554
+ }
555
+ }
556
+ }
557
+ </script>