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