@eturnity/eturnity_reusable_components 1.2.19-EPDM-5295.1 → 1.2.19-EPDM-3412.9

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