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

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