@eturnity/eturnity_reusable_components 1.2.25-EPDM-5202.2 → 1.2.26-EPDM-5363.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/.prettierrc +6 -6
  2. package/.storybook/main.js +8 -8
  3. package/.storybook/preview.js +46 -46
  4. package/README.md +29 -29
  5. package/babel.config.js +5 -5
  6. package/package.json +63 -63
  7. package/public/index.html +17 -17
  8. package/src/App.vue +321 -321
  9. package/src/assets/icons/arrow_down.svg +3 -3
  10. package/src/assets/icons/arrow_up_red.svg +3 -3
  11. package/src/assets/icons/black_spinner.svg +35 -35
  12. package/src/assets/icons/delete_icon.svg +11 -11
  13. package/src/assets/icons/delete_icon_gray.svg +11 -11
  14. package/src/assets/icons/drag_icon.svg +8 -8
  15. package/src/assets/icons/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/battery.svg +3 -3
  45. package/src/assets/svgIcons/bell.svg +3 -3
  46. package/src/assets/svgIcons/bold.svg +3 -3
  47. package/src/assets/svgIcons/bom.svg +3 -3
  48. package/src/assets/svgIcons/bom_generation.svg +10 -10
  49. package/src/assets/svgIcons/bookmaker.svg +3 -3
  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/cross.svg +4 -4
  71. package/src/assets/svgIcons/current_variant.svg +4 -4
  72. package/src/assets/svgIcons/deadline.svg +4 -4
  73. package/src/assets/svgIcons/delete.svg +4 -4
  74. package/src/assets/svgIcons/delete_area_active.svg +16 -16
  75. package/src/assets/svgIcons/delete_area_inactive.svg +15 -15
  76. package/src/assets/svgIcons/direction_active-1.svg +12 -12
  77. package/src/assets/svgIcons/direction_active.svg +5 -5
  78. package/src/assets/svgIcons/direction_inactive.svg +4 -4
  79. package/src/assets/svgIcons/distances_active.svg +9 -9
  80. package/src/assets/svgIcons/distances_inactive.svg +8 -8
  81. package/src/assets/svgIcons/document.svg +3 -3
  82. package/src/assets/svgIcons/downarrow.svg +3 -3
  83. package/src/assets/svgIcons/download.svg +4 -4
  84. package/src/assets/svgIcons/duplicate-1.svg +8 -8
  85. package/src/assets/svgIcons/duplicate-2.svg +5 -5
  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/transfer.svg +4 -4
  164. package/src/assets/svgIcons/truck.svg +3 -3
  165. package/src/assets/svgIcons/underlined.svg +3 -3
  166. package/src/assets/svgIcons/uparrow.svg +3 -3
  167. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  168. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  169. package/src/assets/svgIcons/upload_image.svg +8 -8
  170. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  171. package/src/assets/svgIcons/warning.svg +4 -4
  172. package/src/assets/svgIcons/way.svg +5 -5
  173. package/src/assets/svgIcons/wifi.svg +3 -3
  174. package/src/assets/svgIcons/winter.svg +3 -3
  175. package/src/assets/theme.js +34 -34
  176. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  177. package/src/components/addNewButton/index.vue +58 -58
  178. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  179. package/src/components/buttons/closeButton/index.vue +61 -61
  180. package/src/components/buttons/externalButton/index.vue +101 -101
  181. package/src/components/buttons/mainButton/index.vue +82 -82
  182. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  183. package/src/components/deleteIcon/index.vue +55 -55
  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 +83 -83
  187. package/src/components/infoText/index.vue +151 -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 +390 -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 +253 -253
  195. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  196. package/src/components/inputs/radioButton/index.vue +246 -246
  197. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  198. package/src/components/inputs/searchInput/index.vue +97 -97
  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 +189 -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 +154 -154
  205. package/src/components/modals/modal/modal.stories.js +31 -31
  206. package/src/components/pageSubtitle/index.vue +68 -68
  207. package/src/components/pageTitle/index.vue +45 -45
  208. package/src/components/progressBar/index.vue +125 -125
  209. package/src/components/projectMarker/index.vue +285 -285
  210. package/src/components/spinner/index.vue +71 -71
  211. package/src/components/tableDropdown/index.vue +644 -644
  212. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  213. package/src/components/tables/mainTable/index.vue +379 -379
  214. package/src/components/tables/viewTable/index.vue +195 -195
  215. package/src/components/threeDots/index.vue +333 -333
  216. package/src/helpers/numberConverter.js +98 -98
  217. package/src/helpers/translateLang.js +80 -80
  218. package/src/main.js +13 -13
@@ -1,333 +1,333 @@
1
- <template>
2
- <page-container @click="toggleButton()">
3
- <button-container ref="dropdownItem">
4
- <dot-item />
5
- <dot-item />
6
- <dot-item />
7
- </button-container>
8
- <dropdown-container
9
- v-if="isOpen"
10
- @click.stop
11
- :top="getItemLocation('top')"
12
- :right="getItemLocation('right')"
13
- :containerWidth="childOpen ? 440 : 240"
14
- ref="dropdownContainer"
15
- >
16
- <loading-container v-if="isLoading">
17
- <spinner />
18
- </loading-container>
19
- <children-container
20
- class="child"
21
- :isOpen="hoverItem !== null"
22
- v-if="hoverItem !== null && !isLoading"
23
- >
24
- <option-child
25
- v-for="child in childOpen"
26
- :key="child.value"
27
- @click.stop="
28
- onSelect({
29
- item: child,
30
- hasChildren: hasChildren(child)
31
- })
32
- "
33
- @keyup.enter.stop="
34
- onSelect({
35
- item: child,
36
- hasChildren: hasChildren(child)
37
- })
38
- "
39
- >
40
- {{ child.name }}
41
- </option-child>
42
- </children-container>
43
- <options-container v-if="!isLoading">
44
- <option-item
45
- v-for="(item, index) in options"
46
- :key="item.value"
47
- tabindex="0"
48
- @click.stop="onSelect({ item: item, hasChildren: hasChildren(item) })"
49
- @keyup.enter="
50
- onSelect({ item: item, hasChildren: hasChildren(item) })
51
- "
52
- @mouseover="onItemHover({ index, item })"
53
- :isDisabled="item.disabled"
54
- >
55
- <arrow-left
56
- :hasChildren="hasChildren(item)"
57
- v-if="hasChildren(item)"
58
- />
59
- <span>
60
- {{ item.name }}
61
- </span>
62
- </option-item>
63
- </options-container>
64
- </dropdown-container>
65
- </page-container>
66
- </template>
67
-
68
- <script>
69
- // import ThreeDots from "@eturnity/eturnity_reusable_components/src/components/threeDots"
70
- // To use:
71
- // <three-dots
72
- // :options="listOptions"
73
- // @on-select="onSelect($event)"
74
- // :isLoading="true"
75
- // />
76
- // options to pass:
77
- // listOptions: [
78
- // {
79
- // name: "Option 1",
80
- // value: "option_1",
81
- // children: [
82
- // {
83
- // name: "Option 1 Child",
84
- // value: "option_1_child",
85
- // },
86
- // {
87
- // name: "Option 2 Child",
88
- // value: "option_2_child",
89
- // },
90
- // {
91
- // name: "Option 3 Child",
92
- // value: "option_3_child",
93
- // },
94
- // ],
95
- // },
96
- // {
97
- // name: "Option 2",
98
- // value: "option_2",
99
- // },
100
- // {
101
- // name: "Option 3",
102
- // value: "option_3",
103
- // children: [
104
- // {
105
- // name: "Option 3 Child",
106
- // value: "option_3_child",
107
- // },
108
- // {
109
- // name: "Option 4 Child",
110
- // value: "option_4_child",
111
- // },
112
- // {
113
- // name: "Option 5 Child",
114
- // value: "option_5_child",
115
- // },
116
- // ],
117
- // },
118
- // {
119
- // name: "Option 4",
120
- // value: "option_4",
121
- // },
122
- // ],
123
-
124
- import styled from 'vue-styled-components'
125
- import Spinner from '../spinner'
126
-
127
- const PageContainer = styled.div`
128
- display: grid;
129
- align-items: center;
130
- justify-items: center;
131
- width: 30px;
132
- height: 30px;
133
-
134
- &:hover {
135
- background-color: ${(props) => props.theme.colors.grey5};
136
- border-radius: 4px;
137
- }
138
- `
139
-
140
- const ButtonContainer = styled.div`
141
- display: flex;
142
- flex-direction: column;
143
- align-items: center;
144
- justify-content: center;
145
- padding: 5px;
146
- cursor: pointer;
147
-
148
- div {
149
- // This is the dot color
150
- background-color: #263238;
151
- }
152
- `
153
-
154
- const DotItem = styled.div`
155
- width: 4px;
156
- height: 4px;
157
- margin: 1px;
158
- border-radius: 50%;
159
- `
160
-
161
- const dropdownAttrs = { top: Number, right: Number, containerWidth: Number }
162
- const DropdownContainer = styled('div', dropdownAttrs)`
163
- z-index: 99;
164
- height: 200px;
165
- top: ${(props) => props.top + 'px'};
166
- left: ${(props) => props.right - props.containerWidth + 'px'};
167
- position: absolute;
168
- display: grid;
169
- grid-template-columns: auto auto;
170
- `
171
-
172
- const LoadingContainer = styled.div`
173
- border: 1px solid ${(props) => props.theme.colors.grey3};
174
- display: grid;
175
- grid-template-columns: 1fr;
176
- min-width: 200px;
177
- height: 200px;
178
- align-items: center;
179
- justify-items: center;
180
- background: #fff;
181
- `
182
-
183
- const OptionsContainer = styled.div`
184
- border: 1px solid ${(props) => props.theme.colors.grey3};
185
- display: grid;
186
- grid-template-columns: 1fr;
187
- min-width: 220px;
188
- max-width: 220px;
189
- width: max-content;
190
- border-radius: 4px;
191
- background-color: #fff;
192
- max-height: 220px;
193
- overflow: auto;
194
- height: max-content;
195
- white-space: normal;
196
- `
197
-
198
- const optionAttrs = { isDisabled: Boolean }
199
- const OptionItem = styled('div', optionAttrs)`
200
- padding: 12px;
201
- cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'pointer')};
202
- font-size: 13px;
203
- position: relative;
204
-
205
- &:hover {
206
- background-color: #ebeef4;
207
- }
208
-
209
- &:focus-visible {
210
- outline: none;
211
- background-color: #ebeef4;
212
- }
213
- `
214
- const OptionChild = styled.div`
215
- padding: 12px;
216
- cursor: pointer;
217
- font-size: 13px;
218
- position: relative;
219
-
220
- &:hover {
221
- background-color: #ebeef4;
222
- }
223
-
224
- &:focus-visible {
225
- outline: none;
226
- background-color: #ebeef4;
227
- }
228
- `
229
-
230
- const arrowAttrs = { hasChildren: Boolean }
231
- const ArrowLeft = styled('span', arrowAttrs)`
232
- border: solid #9f9f9f;
233
- border-width: 0 1.5px 1.5px 0;
234
- display: inline-block;
235
- padding: 3px;
236
- margin-bottom: 1px;
237
- transform: rotate(135deg);
238
- margin-right: 3px;
239
- visibility: ${(props) => (props.hasChildren ? 'visible' : 'hidden')};
240
- `
241
-
242
- const childAttrs = { isOpen: Boolean }
243
- const ChildrenContainer = styled('div', childAttrs)`
244
- border: ${(props) =>
245
- props.isOpen ? '1px solid' + props.theme.colors.grey3 : 'none'};
246
- display: grid;
247
- grid-template-columns: 1fr;
248
- min-width: 200px;
249
- max-width: 200px;
250
- white-space: normal;
251
- width: max-content;
252
- border-radius: 4px;
253
- background-color: #fff;
254
- margin-right: -1px;
255
- height: max-content;
256
- max-height: 200px;
257
- overflow: auto;
258
- `
259
-
260
- export default {
261
- name: 'three-dots',
262
- components: {
263
- PageContainer,
264
- ButtonContainer,
265
- DotItem,
266
- OptionsContainer,
267
- OptionItem,
268
- ChildrenContainer,
269
- OptionChild,
270
- ArrowLeft,
271
- DropdownContainer,
272
- Spinner,
273
- LoadingContainer
274
- },
275
- props: {
276
- options: {
277
- required: true
278
- },
279
- isLoading: {
280
- required: false,
281
- default: false
282
- }
283
- },
284
- data() {
285
- return {
286
- isOpen: false,
287
- hoverItem: null,
288
- childOpen: null,
289
- containerWidth: 16
290
- }
291
- },
292
- methods: {
293
- toggleButton() {
294
- this.isOpen = !this.isOpen
295
-
296
- if (this.isOpen) {
297
- document.addEventListener('click', this.clickOutside)
298
- } else {
299
- document.removeEventListener('click', this.clickOutside)
300
- }
301
- },
302
- getItemLocation(value) {
303
- let ref = this.$refs.dropdownItem
304
- let location = ref.$el.getBoundingClientRect()[value]
305
- if (value === 'top') {
306
- location = location + window.scrollY
307
- }
308
- return location
309
- },
310
- hasChildren(item) {
311
- return !!item.children && !!item.children.length
312
- },
313
- onItemHover({ index, item }) {
314
- this.hoverItem = item.children && item.children.length ? index : null
315
- this.childOpen =
316
- item.children && item.children.length ? item.children : null
317
- },
318
- onSelect({ item, hasChildren }) {
319
- if (hasChildren || item.disabled) {
320
- return
321
- }
322
- this.$emit('on-select', item)
323
- this.isOpen = false
324
- },
325
- clickOutside(event) {
326
- if (this.$el.contains(event.target) || !this.isOpen) {
327
- return
328
- }
329
- this.toggleButton()
330
- }
331
- }
332
- }
333
- </script>
1
+ <template>
2
+ <page-container @click="toggleButton()">
3
+ <button-container ref="dropdownItem">
4
+ <dot-item />
5
+ <dot-item />
6
+ <dot-item />
7
+ </button-container>
8
+ <dropdown-container
9
+ v-if="isOpen"
10
+ @click.stop
11
+ :top="getItemLocation('top')"
12
+ :right="getItemLocation('right')"
13
+ :containerWidth="childOpen ? 440 : 240"
14
+ ref="dropdownContainer"
15
+ >
16
+ <loading-container v-if="isLoading">
17
+ <spinner />
18
+ </loading-container>
19
+ <children-container
20
+ class="child"
21
+ :isOpen="hoverItem !== null"
22
+ v-if="hoverItem !== null && !isLoading"
23
+ >
24
+ <option-child
25
+ v-for="child in childOpen"
26
+ :key="child.value"
27
+ @click.stop="
28
+ onSelect({
29
+ item: child,
30
+ hasChildren: hasChildren(child)
31
+ })
32
+ "
33
+ @keyup.enter.stop="
34
+ onSelect({
35
+ item: child,
36
+ hasChildren: hasChildren(child)
37
+ })
38
+ "
39
+ >
40
+ {{ child.name }}
41
+ </option-child>
42
+ </children-container>
43
+ <options-container v-if="!isLoading">
44
+ <option-item
45
+ v-for="(item, index) in options"
46
+ :key="item.value"
47
+ tabindex="0"
48
+ @click.stop="onSelect({ item: item, hasChildren: hasChildren(item) })"
49
+ @keyup.enter="
50
+ onSelect({ item: item, hasChildren: hasChildren(item) })
51
+ "
52
+ @mouseover="onItemHover({ index, item })"
53
+ :isDisabled="item.disabled"
54
+ >
55
+ <arrow-left
56
+ :hasChildren="hasChildren(item)"
57
+ v-if="hasChildren(item)"
58
+ />
59
+ <span>
60
+ {{ item.name }}
61
+ </span>
62
+ </option-item>
63
+ </options-container>
64
+ </dropdown-container>
65
+ </page-container>
66
+ </template>
67
+
68
+ <script>
69
+ // import ThreeDots from "@eturnity/eturnity_reusable_components/src/components/threeDots"
70
+ // To use:
71
+ // <three-dots
72
+ // :options="listOptions"
73
+ // @on-select="onSelect($event)"
74
+ // :isLoading="true"
75
+ // />
76
+ // options to pass:
77
+ // listOptions: [
78
+ // {
79
+ // name: "Option 1",
80
+ // value: "option_1",
81
+ // children: [
82
+ // {
83
+ // name: "Option 1 Child",
84
+ // value: "option_1_child",
85
+ // },
86
+ // {
87
+ // name: "Option 2 Child",
88
+ // value: "option_2_child",
89
+ // },
90
+ // {
91
+ // name: "Option 3 Child",
92
+ // value: "option_3_child",
93
+ // },
94
+ // ],
95
+ // },
96
+ // {
97
+ // name: "Option 2",
98
+ // value: "option_2",
99
+ // },
100
+ // {
101
+ // name: "Option 3",
102
+ // value: "option_3",
103
+ // children: [
104
+ // {
105
+ // name: "Option 3 Child",
106
+ // value: "option_3_child",
107
+ // },
108
+ // {
109
+ // name: "Option 4 Child",
110
+ // value: "option_4_child",
111
+ // },
112
+ // {
113
+ // name: "Option 5 Child",
114
+ // value: "option_5_child",
115
+ // },
116
+ // ],
117
+ // },
118
+ // {
119
+ // name: "Option 4",
120
+ // value: "option_4",
121
+ // },
122
+ // ],
123
+
124
+ import styled from 'vue-styled-components'
125
+ import Spinner from '../spinner'
126
+
127
+ const PageContainer = styled.div`
128
+ display: grid;
129
+ align-items: center;
130
+ justify-items: center;
131
+ width: 30px;
132
+ height: 30px;
133
+
134
+ &:hover {
135
+ background-color: ${(props) => props.theme.colors.grey5};
136
+ border-radius: 4px;
137
+ }
138
+ `
139
+
140
+ const ButtonContainer = styled.div`
141
+ display: flex;
142
+ flex-direction: column;
143
+ align-items: center;
144
+ justify-content: center;
145
+ padding: 5px;
146
+ cursor: pointer;
147
+
148
+ div {
149
+ // This is the dot color
150
+ background-color: #263238;
151
+ }
152
+ `
153
+
154
+ const DotItem = styled.div`
155
+ width: 4px;
156
+ height: 4px;
157
+ margin: 1px;
158
+ border-radius: 50%;
159
+ `
160
+
161
+ const dropdownAttrs = { top: Number, right: Number, containerWidth: Number }
162
+ const DropdownContainer = styled('div', dropdownAttrs)`
163
+ z-index: 99;
164
+ height: 200px;
165
+ top: ${(props) => props.top + 'px'};
166
+ left: ${(props) => props.right - props.containerWidth + 'px'};
167
+ position: absolute;
168
+ display: grid;
169
+ grid-template-columns: auto auto;
170
+ `
171
+
172
+ const LoadingContainer = styled.div`
173
+ border: 1px solid ${(props) => props.theme.colors.grey3};
174
+ display: grid;
175
+ grid-template-columns: 1fr;
176
+ min-width: 200px;
177
+ height: 200px;
178
+ align-items: center;
179
+ justify-items: center;
180
+ background: #fff;
181
+ `
182
+
183
+ const OptionsContainer = styled.div`
184
+ border: 1px solid ${(props) => props.theme.colors.grey3};
185
+ display: grid;
186
+ grid-template-columns: 1fr;
187
+ min-width: 220px;
188
+ max-width: 220px;
189
+ width: max-content;
190
+ border-radius: 4px;
191
+ background-color: #fff;
192
+ max-height: 220px;
193
+ overflow: auto;
194
+ height: max-content;
195
+ white-space: normal;
196
+ `
197
+
198
+ const optionAttrs = { isDisabled: Boolean }
199
+ const OptionItem = styled('div', optionAttrs)`
200
+ padding: 12px;
201
+ cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'pointer')};
202
+ font-size: 13px;
203
+ position: relative;
204
+
205
+ &:hover {
206
+ background-color: #ebeef4;
207
+ }
208
+
209
+ &:focus-visible {
210
+ outline: none;
211
+ background-color: #ebeef4;
212
+ }
213
+ `
214
+ const OptionChild = styled.div`
215
+ padding: 12px;
216
+ cursor: pointer;
217
+ font-size: 13px;
218
+ position: relative;
219
+
220
+ &:hover {
221
+ background-color: #ebeef4;
222
+ }
223
+
224
+ &:focus-visible {
225
+ outline: none;
226
+ background-color: #ebeef4;
227
+ }
228
+ `
229
+
230
+ const arrowAttrs = { hasChildren: Boolean }
231
+ const ArrowLeft = styled('span', arrowAttrs)`
232
+ border: solid #9f9f9f;
233
+ border-width: 0 1.5px 1.5px 0;
234
+ display: inline-block;
235
+ padding: 3px;
236
+ margin-bottom: 1px;
237
+ transform: rotate(135deg);
238
+ margin-right: 3px;
239
+ visibility: ${(props) => (props.hasChildren ? 'visible' : 'hidden')};
240
+ `
241
+
242
+ const childAttrs = { isOpen: Boolean }
243
+ const ChildrenContainer = styled('div', childAttrs)`
244
+ border: ${(props) =>
245
+ props.isOpen ? '1px solid' + props.theme.colors.grey3 : 'none'};
246
+ display: grid;
247
+ grid-template-columns: 1fr;
248
+ min-width: 200px;
249
+ max-width: 200px;
250
+ white-space: normal;
251
+ width: max-content;
252
+ border-radius: 4px;
253
+ background-color: #fff;
254
+ margin-right: -1px;
255
+ height: max-content;
256
+ max-height: 200px;
257
+ overflow: auto;
258
+ `
259
+
260
+ export default {
261
+ name: 'three-dots',
262
+ components: {
263
+ PageContainer,
264
+ ButtonContainer,
265
+ DotItem,
266
+ OptionsContainer,
267
+ OptionItem,
268
+ ChildrenContainer,
269
+ OptionChild,
270
+ ArrowLeft,
271
+ DropdownContainer,
272
+ Spinner,
273
+ LoadingContainer
274
+ },
275
+ props: {
276
+ options: {
277
+ required: true
278
+ },
279
+ isLoading: {
280
+ required: false,
281
+ default: false
282
+ }
283
+ },
284
+ data() {
285
+ return {
286
+ isOpen: false,
287
+ hoverItem: null,
288
+ childOpen: null,
289
+ containerWidth: 16
290
+ }
291
+ },
292
+ methods: {
293
+ toggleButton() {
294
+ this.isOpen = !this.isOpen
295
+
296
+ if (this.isOpen) {
297
+ document.addEventListener('click', this.clickOutside)
298
+ } else {
299
+ document.removeEventListener('click', this.clickOutside)
300
+ }
301
+ },
302
+ getItemLocation(value) {
303
+ let ref = this.$refs.dropdownItem
304
+ let location = ref.$el.getBoundingClientRect()[value]
305
+ if (value === 'top') {
306
+ location = location + window.scrollY
307
+ }
308
+ return location
309
+ },
310
+ hasChildren(item) {
311
+ return !!item.children && !!item.children.length
312
+ },
313
+ onItemHover({ index, item }) {
314
+ this.hoverItem = item.children && item.children.length ? index : null
315
+ this.childOpen =
316
+ item.children && item.children.length ? item.children : null
317
+ },
318
+ onSelect({ item, hasChildren }) {
319
+ if (hasChildren || item.disabled) {
320
+ return
321
+ }
322
+ this.$emit('on-select', item)
323
+ this.isOpen = false
324
+ },
325
+ clickOutside(event) {
326
+ if (this.$el.contains(event.target) || !this.isOpen) {
327
+ return
328
+ }
329
+ this.toggleButton()
330
+ }
331
+ }
332
+ }
333
+ </script>