@eturnity/eturnity_reusable_components 1.2.19-v.5.42.0 → 1.2.20-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 (222) 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 -215
  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/external_icon.svg +6 -6
  16. package/src/assets/icons/language_icon.svg +6 -6
  17. package/src/assets/icons/pdf_icon.svg +6 -6
  18. package/src/assets/icons/plus_button.svg +4 -4
  19. package/src/assets/icons/search_icon_black.svg +3 -3
  20. package/src/assets/icons/subposition_icon.svg +3 -3
  21. package/src/assets/icons/subposition_marker.svg +3 -3
  22. package/src/assets/icons/warning_icon.svg +3 -3
  23. package/src/assets/svgIcons/2d_active.svg +7 -7
  24. package/src/assets/svgIcons/2d_inactive.svg +8 -8
  25. package/src/assets/svgIcons/3d_active.svg +7 -7
  26. package/src/assets/svgIcons/3d_inactive.svg +8 -8
  27. package/src/assets/svgIcons/accept.svg +5 -5
  28. package/src/assets/svgIcons/activate_panels_active.svg +22 -22
  29. package/src/assets/svgIcons/activate_panels_inactive.svg +20 -20
  30. package/src/assets/svgIcons/add_icon-1.svg +3 -3
  31. package/src/assets/svgIcons/add_icon.svg +4 -4
  32. package/src/assets/svgIcons/address_book.svg +3 -3
  33. package/src/assets/svgIcons/after_sale_as_a_service.svg +6 -6
  34. package/src/assets/svgIcons/all_good.svg +3 -3
  35. package/src/assets/svgIcons/angle_active.svg +5 -5
  36. package/src/assets/svgIcons/angle_inactive.svg +4 -4
  37. package/src/assets/svgIcons/area_active.svg +11 -11
  38. package/src/assets/svgIcons/area_inactive.svg +26 -26
  39. package/src/assets/svgIcons/arrow_down.svg +3 -3
  40. package/src/assets/svgIcons/arrow_left.svg +4 -4
  41. package/src/assets/svgIcons/arrow_right.svg +4 -4
  42. package/src/assets/svgIcons/arrow_up.svg +3 -3
  43. package/src/assets/svgIcons/attachment.svg +3 -3
  44. package/src/assets/svgIcons/base_layer.svg +3 -0
  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/roof_layer.svg +3 -0
  148. package/src/assets/svgIcons/rotate_view.svg +5 -5
  149. package/src/assets/svgIcons/run_simulation.svg +3 -3
  150. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  151. package/src/assets/svgIcons/search.svg +3 -3
  152. package/src/assets/svgIcons/security.svg +3 -3
  153. package/src/assets/svgIcons/settings.svg +3 -3
  154. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  155. package/src/assets/svgIcons/smartphone.svg +4 -4
  156. package/src/assets/svgIcons/solar_calc.svg +13 -13
  157. package/src/assets/svgIcons/sorting.svg +4 -4
  158. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  159. package/src/assets/svgIcons/strikethrough.svg +4 -4
  160. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  161. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  162. package/src/assets/svgIcons/subsidies.svg +3 -3
  163. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  164. package/src/assets/svgIcons/suitcase.svg +3 -3
  165. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  166. package/src/assets/svgIcons/truck.svg +3 -3
  167. package/src/assets/svgIcons/underlined.svg +3 -3
  168. package/src/assets/svgIcons/undo.svg +6 -0
  169. package/src/assets/svgIcons/uparrow.svg +3 -3
  170. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  171. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  172. package/src/assets/svgIcons/upload_image.svg +8 -8
  173. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  174. package/src/assets/svgIcons/warning.svg +4 -4
  175. package/src/assets/svgIcons/way.svg +5 -5
  176. package/src/assets/svgIcons/wifi.svg +3 -3
  177. package/src/assets/svgIcons/winter.svg +3 -3
  178. package/src/assets/theme.js +36 -34
  179. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  180. package/src/components/addNewButton/index.vue +58 -58
  181. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  182. package/src/components/buttons/closeButton/index.vue +61 -61
  183. package/src/components/buttons/externalButton/index.vue +101 -101
  184. package/src/components/buttons/mainButton/index.vue +82 -82
  185. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  186. package/src/components/deleteIcon/index.vue +55 -55
  187. package/src/components/errorMessage/index.vue +61 -61
  188. package/src/components/icon/Icons.stories.js +41 -41
  189. package/src/components/icon/iconCollection.vue +68 -68
  190. package/src/components/icon/index.vue +73 -76
  191. package/src/components/iconWrapper/index.vue +116 -0
  192. package/src/components/infoText/index.vue +165 -165
  193. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  194. package/src/components/inputs/checkbox/index.vue +182 -182
  195. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  196. package/src/components/inputs/inputNumber/index.vue +484 -475
  197. package/src/components/inputs/inputNumberQuestion/index.vue +215 -215
  198. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  199. package/src/components/inputs/inputText/index.vue +200 -200
  200. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  201. package/src/components/inputs/radioButton/index.vue +253 -246
  202. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  203. package/src/components/inputs/searchInput/index.vue +96 -97
  204. package/src/components/inputs/slider/index.vue +126 -126
  205. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +135 -135
  206. package/src/components/inputs/textAreaInput/index.vue +194 -194
  207. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  208. package/src/components/inputs/toggle/index.vue +288 -288
  209. package/src/components/modals/modal/index.vue +153 -153
  210. package/src/components/modals/modal/modal.stories.js +31 -31
  211. package/src/components/pageSubtitle/index.vue +64 -68
  212. package/src/components/pageTitle/index.vue +37 -45
  213. package/src/components/progressBar/index.vue +125 -125
  214. package/src/components/spinner/index.vue +71 -71
  215. package/src/components/tableDropdown/index.vue +644 -644
  216. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  217. package/src/components/tables/mainTable/index.vue +365 -365
  218. package/src/components/tables/viewTable/index.vue +195 -195
  219. package/src/components/threeDots/index.vue +324 -324
  220. package/src/helpers/numberConverter.js +102 -101
  221. package/src/helpers/translateLang.js +80 -80
  222. package/src/main.js +11 -11
@@ -1,476 +1,485 @@
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
- :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
- }
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
+ }
476
485
  </script>