@eturnity/eturnity_reusable_components 7.24.3-EPDM-11320.0 → 7.24.3-EPDM-8441.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 (322) hide show
  1. package/.prettierrc +7 -0
  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 -48
  7. package/postcss.config.js +6 -6
  8. package/public/favicon.ico +0 -0
  9. package/public/index.html +17 -0
  10. package/src/App.vue +109 -114
  11. package/src/assets/icons/arrow_down.svg +3 -3
  12. package/src/assets/icons/arrow_up_red.svg +3 -3
  13. package/src/assets/icons/black_spinner.svg +35 -35
  14. package/src/assets/icons/delete_icon.svg +11 -11
  15. package/src/assets/icons/delete_icon_gray.svg +11 -11
  16. package/src/assets/icons/drag_icon.svg +8 -8
  17. package/src/assets/icons/external_icon.svg +6 -6
  18. package/src/assets/icons/language_icon.svg +6 -6
  19. package/src/assets/icons/pdf_icon.svg +6 -6
  20. package/src/assets/icons/plus_button.svg +4 -4
  21. package/src/assets/icons/search_icon_black.svg +3 -3
  22. package/src/assets/icons/subposition_icon.svg +3 -3
  23. package/src/assets/icons/subposition_marker.svg +3 -3
  24. package/src/assets/icons/warning_icon.svg +3 -3
  25. package/src/assets/svgIcons/2d_active.svg +7 -7
  26. package/src/assets/svgIcons/2d_inactive.svg +8 -8
  27. package/src/assets/svgIcons/3d_active.svg +7 -7
  28. package/src/assets/svgIcons/3d_inactive.svg +8 -8
  29. package/src/assets/svgIcons/_readme.md +7 -7
  30. package/src/assets/svgIcons/accept.svg +5 -5
  31. package/src/assets/svgIcons/activate_panels_active.svg +22 -22
  32. package/src/assets/svgIcons/activate_panels_inactive.svg +20 -20
  33. package/src/assets/svgIcons/add_icon-1.svg +3 -3
  34. package/src/assets/svgIcons/add_icon.svg +4 -4
  35. package/src/assets/svgIcons/address_book.svg +3 -3
  36. package/src/assets/svgIcons/after_sale_as_a_service.svg +6 -6
  37. package/src/assets/svgIcons/all_good.svg +3 -3
  38. package/src/assets/svgIcons/angle_active.svg +5 -5
  39. package/src/assets/svgIcons/angle_inactive.svg +4 -4
  40. package/src/assets/svgIcons/area_active.svg +11 -11
  41. package/src/assets/svgIcons/area_inactive.svg +26 -26
  42. package/src/assets/svgIcons/areas_tool.svg +14 -14
  43. package/src/assets/svgIcons/arrow_down.svg +3 -3
  44. package/src/assets/svgIcons/arrow_left.svg +4 -4
  45. package/src/assets/svgIcons/arrow_right.svg +4 -4
  46. package/src/assets/svgIcons/arrow_up.svg +3 -3
  47. package/src/assets/svgIcons/attachment.svg +3 -3
  48. package/src/assets/svgIcons/base_layer.svg +3 -3
  49. package/src/assets/svgIcons/battery.svg +3 -3
  50. package/src/assets/svgIcons/bell.svg +3 -3
  51. package/src/assets/svgIcons/bexio.svg +4 -4
  52. package/src/assets/svgIcons/bold.svg +3 -3
  53. package/src/assets/svgIcons/bom.svg +3 -3
  54. package/src/assets/svgIcons/bom_generation.svg +10 -10
  55. package/src/assets/svgIcons/bookmaker.svg +3 -3
  56. package/src/assets/svgIcons/bubble.svg +3 -3
  57. package/src/assets/svgIcons/bug.svg +5 -5
  58. package/src/assets/svgIcons/bullet_list.svg +8 -8
  59. package/src/assets/svgIcons/calendar.svg +7 -7
  60. package/src/assets/svgIcons/calendar_icon.svg +7 -7
  61. package/src/assets/svgIcons/call.svg +3 -3
  62. package/src/assets/svgIcons/camera.svg +3 -3
  63. package/src/assets/svgIcons/car.svg +3 -3
  64. package/src/assets/svgIcons/cart.svg +3 -3
  65. package/src/assets/svgIcons/charger_icon_white.svg +44 -44
  66. package/src/assets/svgIcons/checkbox.svg +3 -3
  67. package/src/assets/svgIcons/clear_formatting.svg +7 -7
  68. package/src/assets/svgIcons/clickable_info.svg +4 -4
  69. package/src/assets/svgIcons/clip.svg +3 -3
  70. package/src/assets/svgIcons/clock.svg +17 -17
  71. package/src/assets/svgIcons/clock_full.svg +3 -3
  72. package/src/assets/svgIcons/close_for_modals,_tool_tips.svg +4 -4
  73. package/src/assets/svgIcons/co_branding.svg +5 -5
  74. package/src/assets/svgIcons/collapse.svg +4 -4
  75. package/src/assets/svgIcons/collections.svg +3 -3
  76. package/src/assets/svgIcons/component_library.svg +7 -7
  77. package/src/assets/svgIcons/consumption_tariffs.svg +43 -43
  78. package/src/assets/svgIcons/context_menu-1.svg +6 -6
  79. package/src/assets/svgIcons/context_menu-2.svg +5 -5
  80. package/src/assets/svgIcons/context_menu.svg +5 -5
  81. package/src/assets/svgIcons/context_menu_tabs.svg +5 -5
  82. package/src/assets/svgIcons/cross.svg +4 -4
  83. package/src/assets/svgIcons/current_variant.svg +4 -4
  84. package/src/assets/svgIcons/dashboard.svg +3 -3
  85. package/src/assets/svgIcons/data_transfer.svg +3 -3
  86. package/src/assets/svgIcons/deadline.svg +4 -4
  87. package/src/assets/svgIcons/deal_flow.svg +5 -5
  88. package/src/assets/svgIcons/delete.svg +4 -4
  89. package/src/assets/svgIcons/delete_area_active.svg +16 -16
  90. package/src/assets/svgIcons/delete_area_inactive.svg +15 -15
  91. package/src/assets/svgIcons/direction_active-1.svg +12 -12
  92. package/src/assets/svgIcons/direction_active.svg +5 -5
  93. package/src/assets/svgIcons/direction_arrow.svg +4 -4
  94. package/src/assets/svgIcons/direction_inactive.svg +4 -4
  95. package/src/assets/svgIcons/dislike.svg +3 -3
  96. package/src/assets/svgIcons/distance_tool.svg +8 -8
  97. package/src/assets/svgIcons/distances_active.svg +9 -9
  98. package/src/assets/svgIcons/distances_inactive.svg +8 -8
  99. package/src/assets/svgIcons/distort_tool.svg +10 -10
  100. package/src/assets/svgIcons/distort_tool2.svg +16 -16
  101. package/src/assets/svgIcons/document.svg +3 -3
  102. package/src/assets/svgIcons/documents.svg +4 -4
  103. package/src/assets/svgIcons/downarrow.svg +3 -3
  104. package/src/assets/svgIcons/download.svg +4 -4
  105. package/src/assets/svgIcons/drag_icon.svg +8 -8
  106. package/src/assets/svgIcons/draggable_corner.svg +5 -5
  107. package/src/assets/svgIcons/draw_tool.svg +3 -3
  108. package/src/assets/svgIcons/duplicate-1.svg +8 -8
  109. package/src/assets/svgIcons/duplicate-2.svg +5 -5
  110. package/src/assets/svgIcons/duplicate.svg +4 -4
  111. package/src/assets/svgIcons/e-mobility_configurator.svg +6 -6
  112. package/src/assets/svgIcons/e_signature.svg +5 -5
  113. package/src/assets/svgIcons/edit_button.svg +3 -3
  114. package/src/assets/svgIcons/electricity_tariff.svg +3 -3
  115. package/src/assets/svgIcons/email.svg +3 -3
  116. package/src/assets/svgIcons/ems-1.svg +3 -3
  117. package/src/assets/svgIcons/ems.svg +3 -3
  118. package/src/assets/svgIcons/end_of_the_list.svg +5 -5
  119. package/src/assets/svgIcons/erase.svg +4 -4
  120. package/src/assets/svgIcons/external_icon.svg +5 -5
  121. package/src/assets/svgIcons/fav_icon.svg +4 -4
  122. package/src/assets/svgIcons/finance.svg +3 -3
  123. package/src/assets/svgIcons/financing_for_pv-1.svg +5 -5
  124. package/src/assets/svgIcons/financing_for_pv-2.svg +3 -3
  125. package/src/assets/svgIcons/financing_for_pv.svg +6 -6
  126. package/src/assets/svgIcons/finish-1.svg +4 -4
  127. package/src/assets/svgIcons/finish.svg +3 -3
  128. package/src/assets/svgIcons/flatten.svg +11 -11
  129. package/src/assets/svgIcons/flatten_roof.svg +20 -20
  130. package/src/assets/svgIcons/folder.svg +3 -3
  131. package/src/assets/svgIcons/free_technology.svg +5 -5
  132. package/src/assets/svgIcons/handle.svg +5 -5
  133. package/src/assets/svgIcons/heat_calc.svg +7 -7
  134. package/src/assets/svgIcons/height_equalize.svg +3 -3
  135. package/src/assets/svgIcons/height_snap.svg +3 -3
  136. package/src/assets/svgIcons/house.svg +3 -3
  137. package/src/assets/svgIcons/house_3d-1.svg +7 -7
  138. package/src/assets/svgIcons/house_3d.svg +7 -7
  139. package/src/assets/svgIcons/inclination.svg +2 -2
  140. package/src/assets/svgIcons/info.svg +3 -3
  141. package/src/assets/svgIcons/initial_situation.svg +3 -3
  142. package/src/assets/svgIcons/integrations.svg +3 -3
  143. package/src/assets/svgIcons/intro-tour-1.svg +3 -3
  144. package/src/assets/svgIcons/intro-tour.svg +3 -3
  145. package/src/assets/svgIcons/inverter-1.svg +5 -5
  146. package/src/assets/svgIcons/inverter.svg +3 -3
  147. package/src/assets/svgIcons/italic.svg +3 -3
  148. package/src/assets/svgIcons/key.svg +3 -3
  149. package/src/assets/svgIcons/layers_close.svg +4 -4
  150. package/src/assets/svgIcons/layers_open.svg +4 -4
  151. package/src/assets/svgIcons/lead_marketplace.svg +6 -6
  152. package/src/assets/svgIcons/lead_provider.svg +4 -4
  153. package/src/assets/svgIcons/length_2d.svg +2 -2
  154. package/src/assets/svgIcons/length_3d.svg +4 -4
  155. package/src/assets/svgIcons/length_calculator.svg +2 -2
  156. package/src/assets/svgIcons/length_in_2d_active.svg +12 -12
  157. package/src/assets/svgIcons/length_in_2d_inctive.svg +13 -13
  158. package/src/assets/svgIcons/light_bulb.svg +3 -3
  159. package/src/assets/svgIcons/like.svg +3 -3
  160. package/src/assets/svgIcons/line_graph.svg +3 -3
  161. package/src/assets/svgIcons/local_subsidies.svg +18 -18
  162. package/src/assets/svgIcons/location.svg +3 -3
  163. package/src/assets/svgIcons/lock.svg +3 -3
  164. package/src/assets/svgIcons/logout.svg +3 -3
  165. package/src/assets/svgIcons/loop.svg +3 -3
  166. package/src/assets/svgIcons/lunch.svg +4 -4
  167. package/src/assets/svgIcons/magic_tool.svg +6 -6
  168. package/src/assets/svgIcons/map_icon.svg +5 -5
  169. package/src/assets/svgIcons/map_settings.svg +3 -3
  170. package/src/assets/svgIcons/margin_tool.svg +4 -4
  171. package/src/assets/svgIcons/meeting.svg +6 -6
  172. package/src/assets/svgIcons/move_copy.svg +4 -4
  173. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  174. package/src/assets/svgIcons/next.svg +4 -4
  175. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  176. package/src/assets/svgIcons/numbered_list.svg +6 -6
  177. package/src/assets/svgIcons/obstacle_tool.svg +9 -9
  178. package/src/assets/svgIcons/obstacle_tool_origin.svg +3 -3
  179. package/src/assets/svgIcons/offset_tool.svg +8 -8
  180. package/src/assets/svgIcons/outline_tool.svg +11 -11
  181. package/src/assets/svgIcons/pan_tool.svg +12 -12
  182. package/src/assets/svgIcons/panels_tool.svg +8 -8
  183. package/src/assets/svgIcons/pen_tool.svg +4 -4
  184. package/src/assets/svgIcons/picker_tool.svg +4 -4
  185. package/src/assets/svgIcons/picture.svg +3 -3
  186. package/src/assets/svgIcons/pin.svg +5 -5
  187. package/src/assets/svgIcons/presentation.svg +3 -3
  188. package/src/assets/svgIcons/previous.svg +4 -4
  189. package/src/assets/svgIcons/profile-1.svg +4 -4
  190. package/src/assets/svgIcons/profile.svg +4 -4
  191. package/src/assets/svgIcons/profitability.svg +3 -3
  192. package/src/assets/svgIcons/project_analysis.svg +4 -4
  193. package/src/assets/svgIcons/project_settings.svg +4 -4
  194. package/src/assets/svgIcons/pv.svg +3 -3
  195. package/src/assets/svgIcons/quotations.svg +6 -6
  196. package/src/assets/svgIcons/redo.svg +6 -6
  197. package/src/assets/svgIcons/resizer.svg +5 -5
  198. package/src/assets/svgIcons/roof_layer.svg +3 -3
  199. package/src/assets/svgIcons/rotate_tool.svg +3 -3
  200. package/src/assets/svgIcons/rotate_view.svg +5 -5
  201. package/src/assets/svgIcons/ruler_tool.svg +3 -3
  202. package/src/assets/svgIcons/run_simulation.svg +3 -3
  203. package/src/assets/svgIcons/save.svg +3 -3
  204. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  205. package/src/assets/svgIcons/search.svg +3 -3
  206. package/src/assets/svgIcons/security.svg +3 -3
  207. package/src/assets/svgIcons/settings.svg +3 -3
  208. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  209. package/src/assets/svgIcons/smartphone.svg +4 -4
  210. package/src/assets/svgIcons/solar_calc.svg +13 -13
  211. package/src/assets/svgIcons/sorting.svg +4 -4
  212. package/src/assets/svgIcons/split.svg +12 -12
  213. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  214. package/src/assets/svgIcons/strikethrough.svg +4 -4
  215. package/src/assets/svgIcons/subscriptions.svg +3 -3
  216. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  217. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  218. package/src/assets/svgIcons/subsidies.svg +3 -3
  219. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  220. package/src/assets/svgIcons/suitcase.svg +3 -3
  221. package/src/assets/svgIcons/summer.svg +3 -3
  222. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  223. package/src/assets/svgIcons/transfer.svg +4 -4
  224. package/src/assets/svgIcons/trim_tool.svg +4 -4
  225. package/src/assets/svgIcons/truck.svg +3 -3
  226. package/src/assets/svgIcons/underlined.svg +3 -3
  227. package/src/assets/svgIcons/undo.svg +6 -6
  228. package/src/assets/svgIcons/uparrow.svg +3 -3
  229. package/src/assets/svgIcons/update.svg +3 -3
  230. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  231. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  232. package/src/assets/svgIcons/upload_image.svg +8 -8
  233. package/src/assets/svgIcons/upload_image_tool.svg +7 -7
  234. package/src/assets/svgIcons/variants.svg +6 -6
  235. package/src/assets/svgIcons/vertical_tool.svg +3 -3
  236. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  237. package/src/assets/svgIcons/warning.svg +4 -4
  238. package/src/assets/svgIcons/way.svg +5 -5
  239. package/src/assets/svgIcons/wifi.svg +3 -3
  240. package/src/assets/svgIcons/winter.svg +3 -3
  241. package/src/assets/svgIcons/workflow_template.svg +11 -11
  242. package/src/assets/theme.js +41 -41
  243. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  244. package/src/components/addNewButton/index.vue +64 -61
  245. package/src/components/banner/actionBanner/index.vue +65 -67
  246. package/src/components/banner/banner/banner.stories.js +31 -31
  247. package/src/components/banner/banner/index.vue +188 -196
  248. package/src/components/banner/infoBanner/index.vue +69 -61
  249. package/src/components/buttons/buttonIcon/index.vue +142 -147
  250. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  251. package/src/components/buttons/closeButton/index.vue +61 -61
  252. package/src/components/buttons/mainButton/index.vue +140 -144
  253. package/src/components/card/index.vue +96 -100
  254. package/src/components/collapsableInfoText/index.vue +125 -130
  255. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  256. package/src/components/deleteIcon/index.vue +78 -81
  257. package/src/components/draggableInputHandle/index.vue +46 -49
  258. package/src/components/dropdown/Dropdown.stories.js +54 -54
  259. package/src/components/dropdown/index.vue +138 -141
  260. package/src/components/errorMessage/index.vue +64 -64
  261. package/src/components/filter/filterSettings.vue +633 -653
  262. package/src/components/filter/index.vue +154 -154
  263. package/src/components/filter/parentDropdown.vue +91 -94
  264. package/src/components/icon/Icons.stories.js +41 -41
  265. package/src/components/icon/iconCache.js +23 -23
  266. package/src/components/icon/iconCollection.vue +68 -71
  267. package/src/components/icon/index.vue +139 -146
  268. package/src/components/iconWrapper/index.vue +179 -183
  269. package/src/components/infoCard/index.vue +35 -38
  270. package/src/components/infoText/index.vue +160 -166
  271. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  272. package/src/components/inputs/checkbox/index.vue +214 -211
  273. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  274. package/src/components/inputs/inputNumber/index.vue +710 -730
  275. package/src/components/inputs/inputNumberQuestion/index.vue +215 -218
  276. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  277. package/src/components/inputs/inputText/index.vue +392 -388
  278. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  279. package/src/components/inputs/radioButton/index.vue +270 -285
  280. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  281. package/src/components/inputs/searchInput/index.vue +150 -153
  282. package/src/components/inputs/select/index.vue +996 -898
  283. package/src/components/inputs/select/option/index.vue +144 -148
  284. package/src/components/inputs/select/select.stories.js +59 -59
  285. package/src/components/inputs/slider/index.vue +126 -126
  286. package/src/components/inputs/switchField/index.vue +256 -263
  287. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  288. package/src/components/inputs/textAreaInput/index.vue +200 -207
  289. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  290. package/src/components/inputs/toggle/index.vue +288 -298
  291. package/src/components/label/index.vue +99 -102
  292. package/src/components/markerItem/index.vue +86 -86
  293. package/src/components/modals/actionModal/index.vue +64 -67
  294. package/src/components/modals/infoModal/index.vue +49 -56
  295. package/src/components/modals/modal/index.vue +188 -196
  296. package/src/components/modals/modal/modal.stories.js +31 -31
  297. package/src/components/navigationTabs/index.vue +112 -115
  298. package/src/components/pageSubtitle/index.vue +61 -65
  299. package/src/components/pageTitle/index.vue +68 -76
  300. package/src/components/pagination/index.vue +145 -147
  301. package/src/components/progressBar/index.vue +125 -128
  302. package/src/components/projectMarker/index.vue +298 -307
  303. package/src/components/rangeSlider/Slider.vue +547 -547
  304. package/src/components/rangeSlider/index.vue +517 -529
  305. package/src/components/rangeSlider/utils/dom.js +49 -49
  306. package/src/components/rangeSlider/utils/fns.js +26 -26
  307. package/src/components/selectedOptions/index.vue +145 -145
  308. package/src/components/sideMenu/index.vue +270 -278
  309. package/src/components/spinner/index.vue +68 -71
  310. package/src/components/tableDropdown/index.vue +638 -655
  311. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  312. package/src/components/tables/mainTable/index.vue +447 -450
  313. package/src/components/tables/viewTable/index.vue +195 -208
  314. package/src/components/threeDots/index.vue +407 -410
  315. package/src/components/videoThumbnail/index.vue +103 -111
  316. package/src/components/videoThumbnail/videoThumbnail.stories.js +35 -35
  317. package/src/helpers/currencyMapping.js +28 -28
  318. package/src/helpers/numberConverter.js +103 -103
  319. package/src/helpers/translateLang.js +127 -127
  320. package/src/main.js +6 -6
  321. package/src/mixins/inputValidations.js +97 -97
  322. package/.eslintrc.js +0 -125
@@ -1,529 +1,517 @@
1
- <template>
2
- <RangeSliderContainer>
3
- <Labels v-if="topLabels && topLabels.length > 0">
4
- <Label
5
- v-for="label in topLabels"
6
- :key="label"
7
- >
8
- {{ label }}
9
- </Label>
10
- </Labels>
11
-
12
- <BarContainer v-if="leftLabels && leftLabels.length > 0">
13
- <BarWrapper
14
- v-for="(label, index) in leftLabels"
15
- :key="index"
16
- >
17
- <VerticalLabel>{{ label.name }}</VerticalLabel>
18
- <BarSlider>
19
- <Bar
20
- :data-id="`slider_bar_${dataLocation}_${label.id}`"
21
- @click.native.stop="
22
- onBarRightClick({ event: $event, label, type: 'add' })
23
- "
24
- >
25
- <SliderWrapper>
26
- <Slider
27
- v-for="(bar, index) in label.selectedTariffs"
28
- :key="bar.id"
29
- :color="
30
- hasOverlap && OverlapId.includes(label.id)
31
- ? '#ff5656'
32
- : bar.color
33
- "
34
- :data-id="`slider_bar_item_${dataLocation}_${label.id}_${bar.name}`"
35
- :draggable="!disabled"
36
- :max="bar.max"
37
- :min="bar.min"
38
- :min-width="minWidth"
39
- :resizable="!disabled"
40
- :step="step"
41
- :step-count="stepCount"
42
- :sub-step-count="subStepCount"
43
- :z="index"
44
- @activated="onActivateBar({ item: bar })"
45
- @click.native.stop="
46
- onBarTariffClick({ item: bar, type: 'delete', label })
47
- "
48
- @deactivated="onDeactivateBar()"
49
- @drag-stop="
50
- onChange('drag', {
51
- itemId: bar.id,
52
- parentId: bar.parentId,
53
- entityId: label.id,
54
- ...$event
55
- })
56
- "
57
- @resize-stop="
58
- onChange('resize', {
59
- itemId: bar.id,
60
- entityId: label.id,
61
- ...$event
62
- })
63
- "
64
- >
65
- <template #mr>
66
- <HandleIcon />
67
- </template>
68
- <template #ml>
69
- <HandleIcon />
70
- </template>
71
- </Slider>
72
- </SliderWrapper>
73
- </Bar>
74
- <Ruler>
75
- <RulerRule
76
- v-for="n in stepCount"
77
- :key="n"
78
- />
79
- </Ruler>
80
- <SubRuler>
81
- <RulerSubRule
82
- v-for="n in subStepCount"
83
- :key="n"
84
- />
85
- </SubRuler>
86
- <ErrorMessage
87
- v-if="!canOverlap && hasOverlap && OverlapId.includes(label.id)"
88
- >
89
- *{{ $gettext('overlap_error_message') }}
90
- </ErrorMessage>
91
- </BarSlider>
92
- </BarWrapper>
93
- </BarContainer>
94
- <BarOptionsContainer
95
- v-if="showBarOptions"
96
- ref="barDropdown"
97
- :left="barOptionsPosition.x"
98
- :top="barOptionsPosition.y"
99
- >
100
- <BarItemContainer
101
- v-for="item in barOptionsList"
102
- :key="item.id"
103
- @click="
104
- onBarTariffClick({ item, type: barOptionsType, label: activeLabel })
105
- "
106
- >
107
- <AddIcon />
108
- <BarItemText>{{ item.name }}</BarItemText>
109
- </BarItemContainer>
110
- </BarOptionsContainer>
111
- </RangeSliderContainer>
112
- </template>
113
-
114
- <script>
115
- import styled from 'vue3-styled-components'
116
- import handleSVG from '../../assets/svgIcons/handle.svg'
117
- import add from '../../assets/svgIcons/add_icon.svg'
118
-
119
- import SliderComponent from './Slider'
120
-
121
- const wrapperAttrs = { width: String, height: String }
122
- const SliderWrapper = styled('div', wrapperAttrs)`
123
- position: relative;
124
- display: flex;
125
- height: ${(props) => props.height || '24px'};
126
- width: ${(props) => props.width || '100%'};
127
- `
128
-
129
- const sliderAttrs = { color: String, draggable: Boolean }
130
- const Slider = styled(SliderComponent, sliderAttrs)`
131
- cursor: ${(props) => (props.draggable ? 'pointer' : 'not-allowed')};
132
- opacity: 0.7;
133
- display: flex;
134
- justify-content: space-between;
135
- align-items: center;
136
- border: unset !important;
137
- background-color: ${(props) => props.color};
138
- `
139
-
140
- const ErrorMessage = styled.p`
141
- color: ${(props) => props.theme.colors.red};
142
- font-style: italic;
143
- font-size: 13px;
144
- margin-top: 5px;
145
- `
146
-
147
- const Bar = styled.div`
148
- display: flex;
149
- margin-bottom: -30px;
150
- margin-left: 1px;
151
- background-color: #f6faff;
152
- width: 100%;
153
- background-color: ${(props) => props.theme.colors.gray1};
154
- `
155
-
156
- const Ruler = styled.div`
157
- margin: 10px 0px -5px 0px;
158
- display: flex;
159
- overflow: hidden;
160
- `
161
-
162
- const RulerRule = styled.div`
163
- border-left: solid 1px ${(props) => props.theme.colors.grey2};
164
- border-bottom: solid 1px ${(props) => props.theme.colors.grey2};
165
- display: flex;
166
- flex-grow: 1;
167
- flex-shrink: 1;
168
- padding: 10px 0px;
169
-
170
- &:last-child {
171
- border-right: solid 1px ${(props) => props.theme.colors.grey2};
172
- }
173
- `
174
-
175
- const SubRuler = styled.div`
176
- margin: -7px 0px -5px 0px;
177
- display: flex;
178
- `
179
-
180
- const RulerSubRule = styled.div`
181
- border-left: solid 1px ${(props) => props.theme.colors.grey2};
182
- border-bottom: solid 1px ${(props) => props.theme.colors.grey2};
183
- display: flex;
184
- flex-grow: 1;
185
- flex-shrink: 1;
186
- padding: 3px 0px;
187
-
188
- &:last-child {
189
- border-right: solid 1px ${(props) => props.theme.colors.grey2};
190
- }
191
-
192
- &:nth-child(odd) {
193
- margin-top: -5px;
194
- padding: 5px 0px;
195
- }
196
- `
197
-
198
- const BarSlider = styled.div`
199
- width: 100%;
200
- `
201
-
202
- const BarContainer = styled.div`
203
- display: flex;
204
- flex-direction: column;
205
- `
206
-
207
- const BarWrapper = styled.div`
208
- display: flex;
209
- flex-direction: row;
210
- margin: 20px 0px;
211
- align-items: center;
212
- `
213
-
214
- const RangeSliderContainer = styled.div`
215
- display: flex;
216
- position: relative;
217
- padding: 20px 10px;
218
- flex-direction: column;
219
- user-select: none;
220
- width: 100%;
221
- `
222
-
223
- const Labels = styled.div`
224
- display: flex;
225
- justify-content: space-between;
226
- padding: 0px;
227
- margin: 10px -100px 0px 100px;
228
- width: calc(100% - 100px);
229
- `
230
-
231
- const Label = styled.div`
232
- font-size: 80%;
233
- display: flex;
234
- width: 1px;
235
- justify-content: center;
236
- `
237
-
238
- const VerticalLabel = styled.div`
239
- text-align: left;
240
- min-width: 100px;
241
- font-size: 13px;
242
- `
243
-
244
- const AddIcon = styled(add)`
245
- width: 33px;
246
- height: 29px;
247
- fill: black
248
- margin-left: -17px;
249
- margin-top: -10px;
250
- `
251
-
252
- const HandleIcon = styled(handleSVG)`
253
- width: 13px;
254
- min-width: 0;
255
- margin: -6px;
256
- `
257
-
258
- const BarOptionAttrs = { top: Number, left: Number }
259
- const BarOptionsContainer = styled('div', BarOptionAttrs)`
260
- display: grid;
261
- position: fixed;
262
- z-index: 9999;
263
- border-radius: 4px;
264
- background-color: ${(props) => props.theme.colors.white};
265
- padding: 6px 10px;
266
- border: 1px solid ${(props) => props.theme.colors.grey4};
267
- top: ${(props) => props.top + 'px'};
268
- left: ${(props) => props.left + 'px'};
269
- `
270
-
271
- const BarItemContainer = styled.div`
272
- display: grid;
273
- grid-template-columns: auto 1fr;
274
- grid-gap: 12px;
275
- align-items: center;
276
- cursor: pointer;
277
- padding: 6px 10px;
278
- border-radius: 4px;
279
-
280
- &:hover {
281
- background-color: ${(props) => props.theme.colors.lightGray};
282
- }
283
- `
284
-
285
- const BarItemText = styled.div`
286
- font-size: 13px;
287
- `
288
-
289
- export default {
290
- name: 'RangeSlider',
291
- components: {
292
- Bar,
293
- Label,
294
- Labels,
295
- Ruler,
296
- Slider,
297
- AddIcon,
298
- SubRuler,
299
- BarSlider,
300
- RulerRule,
301
- HandleIcon,
302
- BarWrapper,
303
- ErrorMessage,
304
- RulerSubRule,
305
- BarContainer,
306
- SliderWrapper,
307
- VerticalLabel,
308
- RangeSliderContainer,
309
- BarOptionsContainer,
310
- BarItemContainer,
311
- BarItemText
312
- },
313
- props: {
314
- dataLocation: { type: String, default: '' },
315
- tariffItems: { type: Array, default: () => [] },
316
- labels: { type: Array, default: () => [] },
317
- rangeMargin: { type: Number, default: 1 },
318
- step: { type: Number, default: 1 },
319
- minWidth: { type: Number, default: 1 },
320
- canOverlap: { type: Boolean, default: true },
321
- disabled: { type: Boolean, default: false }
322
- },
323
- data() {
324
- return {
325
- showBarOptions: false,
326
- barOptionsPosition: { x: 0, y: 0 },
327
- barOptionsList: [],
328
- barOptionsType: null, // can be "add" or "delete"
329
- activeLabel: null,
330
- activeItem: null,
331
- OverlapId: [],
332
- hasOverlap: false
333
- }
334
- },
335
- computed: {
336
- maximum() {
337
- if (!this.labels.length) return
338
-
339
- return this.topLabels.at(-1)
340
- },
341
- minimum() {
342
- if (!this.labels.length) return
343
-
344
- return this.topLabels[0]
345
- },
346
- topLabels() {
347
- if (!this.labels.length) return
348
- const labels = this.labels.find((label) => label.placement === 'top')
349
-
350
- return labels ? labels.value : []
351
- },
352
- leftLabels() {
353
- if (!this.labels.length) return
354
- const labels = this.labels.find((label) => label.placement === 'left')
355
- return labels ? labels.value : []
356
- },
357
- stepCount() {
358
- let labels = this.topLabels || []
359
-
360
- if (labels.length) {
361
- return labels.length - 1
362
- }
363
-
364
- return Math.floor((this.maximum - this.minimum) / this.step)
365
- },
366
- subStepCount() {
367
- let labels = this.topLabels || []
368
-
369
- if (labels.length && this.step) {
370
- return (this.maximum - this.minimum) / this.step
371
- }
372
-
373
- return 0
374
- }
375
- },
376
- watch: {
377
- labels(newVal, oldVal) {
378
- const overlapContainer = []
379
-
380
- //check items for overlap
381
- if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
382
- const labels = newVal.find((label) => label.placement === 'left')
383
-
384
- if (labels) {
385
- labels.value.forEach((label) => {
386
- label.selectedTariffs.forEach((tariff) => {
387
- const hasOverlap = this.checkOverlap(
388
- tariff,
389
- label.selectedTariffs
390
- )
391
-
392
- if (hasOverlap) overlapContainer.push(label.id)
393
- })
394
- })
395
- }
396
-
397
- const hasOverlap = overlapContainer.length > 0
398
-
399
- if (!hasOverlap) {
400
- this.OverlapId = []
401
- } else {
402
- this.OverlapId = [...new Set(overlapContainer)]
403
- }
404
-
405
- this.hasOverlap = hasOverlap
406
- this.$emit('has-overlap', hasOverlap)
407
- }
408
- }
409
- },
410
- beforeDestroy() {
411
- // Remove the global click event listener to prevent memory leaks
412
- document.removeEventListener('click', this.handleOutsideClick)
413
- document.removeEventListener('keydown', this.onKeyDownDelete)
414
- },
415
- methods: {
416
- onChange(type, value) {
417
- this.$emit(type, value)
418
- },
419
- checkOverlap(value, tariffs) {
420
- // Check if the tariffs overlap
421
- const min = parseFloat(value.min)
422
- const max = parseFloat(value.max)
423
-
424
- return tariffs.some((tariff) => {
425
- if (tariff.id === value.itemId || tariff.id === value.id) return false
426
-
427
- return (
428
- min === tariff.min ||
429
- max === tariff.max ||
430
- (min > tariff.min && min < tariff.max) ||
431
- (max > tariff.min && max < tariff.max) ||
432
- (min < tariff.min && max > tariff.max)
433
- )
434
- })
435
- },
436
- barOptionLabel(value) {
437
- if (this.barOptionsType === 'add')
438
- return `${this.$gettext('Add')} ${value}`
439
-
440
- return `${this.$gettext('Remove')} ${value}`
441
- },
442
- onActivateBar({ item }) {
443
- this.$emit('activate')
444
- this.activeItem = item
445
- document.addEventListener('keydown', this.onKeyDownDelete)
446
- },
447
- onDeactivateBar() {
448
- this.$emit('deactivate')
449
- this.activeItem = null
450
- document.removeEventListener('keydown', this.onKeyDownDelete)
451
- },
452
- onKeyDownDelete(event) {
453
- // Check if the pressed key is the Delete or Backspace key
454
- if (
455
- (event.key === 'Delete' || event.key === 'Backspace') &&
456
- this.activeItem
457
- ) {
458
- this.$emit('on-bar-tariff-click', {
459
- type: 'delete',
460
- item: this.activeItem,
461
- label: this.activeLabel
462
- })
463
- this.activeItem = null
464
- }
465
- },
466
- onBarTariffClick({ item, type, label }) {
467
- if (this.disabled) return
468
-
469
- this.$emit('on-bar-tariff-click', {
470
- type,
471
- item,
472
- label
473
- })
474
-
475
- this.activeLabel = label
476
- this.barOptionsType = type
477
- this.showBarOptions = false
478
- },
479
- setBarOptions(bar) {
480
- this.barOptionsList = []
481
-
482
- if (this.barOptionsType === 'add') {
483
- this.tariffItems.forEach((item) => {
484
- if (item.name && item.name.length) {
485
- this.barOptionsList.push(item)
486
- }
487
- })
488
- } else {
489
- // add based on the index in the chart.
490
- this.barOptionsList.push({
491
- name: bar.name,
492
- id: bar.id
493
- })
494
- }
495
- },
496
- onBarRightClick({ event, label, type, bar }) {
497
- if (this.disabled) return
498
-
499
- // type can be "add", "delete"
500
- // if "add", show all tariffItems for the group
501
- // if "delete", only show the delete with the tariff name
502
- event.preventDefault()
503
- this.activeLabel = label
504
- this.barOptionsType = type
505
- this.setBarOptions(bar)
506
-
507
- if (this.barOptionsList.length) {
508
- this.showBarOptions = true
509
- this.barOptionsPosition = { x: event.clientX, y: event.clientY }
510
- document.addEventListener('click', this.handleOutsideClick)
511
- } else {
512
- this.showBarOptions = false
513
- }
514
- },
515
- handleOutsideClick(event) {
516
- // Check if the click occurred outside the dropdown
517
- if (
518
- this.$refs.barDropdown &&
519
- !this.$refs.barDropdown.$el.contains(event.target)
520
- ) {
521
- // Hide the dropdown
522
- this.showBarOptions = false
523
- // Remove the global click event listener
524
- document.removeEventListener('click', this.handleOutsideClick)
525
- }
526
- }
527
- }
528
- }
529
- </script>
1
+ <template>
2
+ <RangeSliderContainer>
3
+ <Labels v-if="topLabels && topLabels.length > 0">
4
+ <Label v-for="label in topLabels" :key="label">
5
+ {{ label }}
6
+ </Label>
7
+ </Labels>
8
+
9
+ <BarContainer v-if="leftLabels && leftLabels.length > 0">
10
+ <BarWrapper v-for="(label, index) in leftLabels" :key="index">
11
+ <VerticalLabel>{{ label.name }}</VerticalLabel>
12
+ <BarSlider>
13
+ <Bar
14
+ @click.native.stop="
15
+ onBarRightClick({ event: $event, label, type: 'add' })
16
+ "
17
+ :data-id="`slider_bar_${dataLocation}_${label.id}`"
18
+ >
19
+ <SliderWrapper>
20
+ <Slider
21
+ v-for="(bar, index) in label.selectedTariffs"
22
+ :dataId="`slider_bar_item_${dataLocation}_${label.id}_${bar.name}`"
23
+ :key="bar.id"
24
+ :draggable="!disabled"
25
+ :resizable="!disabled"
26
+ :color="
27
+ hasOverlap && OverlapId.includes(label.id)
28
+ ? '#ff5656'
29
+ : bar.color
30
+ "
31
+ :minWidth="minWidth"
32
+ :min="bar.min"
33
+ :max="bar.max"
34
+ :z="index"
35
+ :step="step"
36
+ :stepCount="stepCount"
37
+ :subStepCount="subStepCount"
38
+ @dragStop="
39
+ onChange('drag', {
40
+ itemId: bar.id,
41
+ parentId: bar.parentId,
42
+ entityId: label.id,
43
+ ...$event
44
+ })
45
+ "
46
+ @resizeStop="
47
+ onChange('resize', {
48
+ itemId: bar.id,
49
+ entityId: label.id,
50
+ ...$event
51
+ })
52
+ "
53
+ @click.native.stop="
54
+ onBarTariffClick({ item: bar, type: 'delete', label })
55
+ "
56
+ @activated="onActivateBar({ item: bar })"
57
+ @deactivated="onDeactivateBar()"
58
+ >
59
+ <template #mr>
60
+ <HandleIcon />
61
+ </template>
62
+ <template #ml>
63
+ <HandleIcon />
64
+ </template>
65
+ </Slider>
66
+ </SliderWrapper>
67
+ </Bar>
68
+ <Ruler>
69
+ <RulerRule v-for="n in stepCount" :key="n"></RulerRule>
70
+ </Ruler>
71
+ <SubRuler>
72
+ <RulerSubRule v-for="n in subStepCount" :key="n"></RulerSubRule>
73
+ </SubRuler>
74
+ <ErrorMessage
75
+ v-if="!canOverlap && hasOverlap && OverlapId.includes(label.id)"
76
+ >
77
+ *{{ $gettext('overlap_error_message') }}
78
+ </ErrorMessage>
79
+ </BarSlider>
80
+ </BarWrapper>
81
+ </BarContainer>
82
+ <bar-options-container
83
+ v-if="showBarOptions"
84
+ :top="barOptionsPosition.y"
85
+ :left="barOptionsPosition.x"
86
+ ref="barDropdown"
87
+ >
88
+ <bar-item-container
89
+ v-for="item in barOptionsList"
90
+ :key="item.id"
91
+ @click="
92
+ onBarTariffClick({ item, type: barOptionsType, label: activeLabel })
93
+ "
94
+ >
95
+ <AddIcon />
96
+ <bar-item-text>{{ item.name }}</bar-item-text>
97
+ </bar-item-container>
98
+ </bar-options-container>
99
+ </RangeSliderContainer>
100
+ </template>
101
+
102
+ <script>
103
+ import styled from 'vue3-styled-components'
104
+ import handleSVG from '../../assets/svgIcons/handle.svg'
105
+ import add from '../../assets/svgIcons/add_icon.svg'
106
+
107
+ import SliderComponent from './Slider'
108
+
109
+ const wrapperAttrs = { width: String, height: String }
110
+ const SliderWrapper = styled('div', wrapperAttrs)`
111
+ position: relative;
112
+ display: flex;
113
+ height: ${(props) => props.height || '24px'};
114
+ width: ${(props) => props.width || '100%'};
115
+ `
116
+
117
+ const sliderAttrs = { color: String, draggable: Boolean }
118
+ const Slider = styled(SliderComponent, sliderAttrs)`
119
+ cursor: ${(props) => (props.draggable ? 'pointer' : 'not-allowed')};
120
+ opacity: 0.7;
121
+ display: flex;
122
+ justify-content: space-between;
123
+ align-items: center;
124
+ border: unset !important;
125
+ background-color: ${(props) => props.color};
126
+ `
127
+
128
+ const ErrorMessage = styled.p`
129
+ color: ${(props) => props.theme.colors.red};
130
+ font-style: italic;
131
+ font-size: 13px;
132
+ margin-top: 5px;
133
+ `
134
+
135
+ const Bar = styled.div`
136
+ display: flex;
137
+ margin-bottom: -30px;
138
+ margin-left: 1px;
139
+ background-color: #f6faff;
140
+ width: 100%;
141
+ background-color: ${(props) => props.theme.colors.gray1};
142
+ `
143
+
144
+ const Ruler = styled.div`
145
+ margin: 10px 0px -5px 0px;
146
+ display: flex;
147
+ overflow: hidden;
148
+ `
149
+
150
+ const RulerRule = styled.div`
151
+ border-left: solid 1px ${(props) => props.theme.colors.grey2};
152
+ border-bottom: solid 1px ${(props) => props.theme.colors.grey2};
153
+ display: flex;
154
+ flex-grow: 1;
155
+ flex-shrink: 1;
156
+ padding: 10px 0px;
157
+
158
+ &:last-child {
159
+ border-right: solid 1px ${(props) => props.theme.colors.grey2};
160
+ }
161
+ `
162
+
163
+ const SubRuler = styled.div`
164
+ margin: -7px 0px -5px 0px;
165
+ display: flex;
166
+ `
167
+
168
+ const RulerSubRule = styled.div`
169
+ border-left: solid 1px ${(props) => props.theme.colors.grey2};
170
+ border-bottom: solid 1px ${(props) => props.theme.colors.grey2};
171
+ display: flex;
172
+ flex-grow: 1;
173
+ flex-shrink: 1;
174
+ padding: 3px 0px;
175
+
176
+ &:last-child {
177
+ border-right: solid 1px ${(props) => props.theme.colors.grey2};
178
+ }
179
+
180
+ &:nth-child(odd) {
181
+ margin-top: -5px;
182
+ padding: 5px 0px;
183
+ }
184
+ `
185
+
186
+ const BarSlider = styled.div`
187
+ width: 100%;
188
+ `
189
+
190
+ const BarContainer = styled.div`
191
+ display: flex;
192
+ flex-direction: column;
193
+ `
194
+
195
+ const BarWrapper = styled.div`
196
+ display: flex;
197
+ flex-direction: row;
198
+ margin: 20px 0px;
199
+ align-items: center;
200
+ `
201
+
202
+ const RangeSliderContainer = styled.div`
203
+ display: flex;
204
+ position: relative;
205
+ padding: 20px 10px;
206
+ flex-direction: column;
207
+ user-select: none;
208
+ width: 100%;
209
+ `
210
+
211
+ const Labels = styled.div`
212
+ display: flex;
213
+ justify-content: space-between;
214
+ padding: 0px;
215
+ margin: 10px -100px 0px 100px;
216
+ width: calc(100% - 100px);
217
+ `
218
+
219
+ const Label = styled.div`
220
+ font-size: 80%;
221
+ display: flex;
222
+ width: 1px;
223
+ justify-content: center;
224
+ `
225
+
226
+ const VerticalLabel = styled.div`
227
+ text-align: left;
228
+ min-width: 100px;
229
+ font-size: 13px;
230
+ `
231
+
232
+ const AddIcon = styled(add)`
233
+ width: 33px;
234
+ height: 29px;
235
+ fill: black
236
+ margin-left: -17px;
237
+ margin-top: -10px;
238
+ `
239
+
240
+ const HandleIcon = styled(handleSVG)`
241
+ width: 13px;
242
+ min-width: 0;
243
+ margin: -6px;
244
+ `
245
+
246
+ const BarOptionAttrs = { top: Number, left: Number }
247
+ const BarOptionsContainer = styled('div', BarOptionAttrs)`
248
+ display: grid;
249
+ position: fixed;
250
+ z-index: 9999;
251
+ border-radius: 4px;
252
+ background-color: ${(props) => props.theme.colors.white};
253
+ padding: 6px 10px;
254
+ border: 1px solid ${(props) => props.theme.colors.grey4};
255
+ top: ${(props) => props.top + 'px'};
256
+ left: ${(props) => props.left + 'px'};
257
+ `
258
+
259
+ const BarItemContainer = styled.div`
260
+ display: grid;
261
+ grid-template-columns: auto 1fr;
262
+ grid-gap: 12px;
263
+ align-items: center;
264
+ cursor: pointer;
265
+ padding: 6px 10px;
266
+ border-radius: 4px;
267
+
268
+ &:hover {
269
+ background-color: ${(props) => props.theme.colors.lightGray};
270
+ }
271
+ `
272
+
273
+ const BarItemText = styled.div`
274
+ font-size: 13px;
275
+ `
276
+
277
+ export default {
278
+ name: 'RangeSlider',
279
+ props: {
280
+ dataLocation: { type: String, default: '' },
281
+ tariffItems: { type: Array, default: () => [] },
282
+ labels: { type: Array, default: () => [] },
283
+ rangeMargin: { type: Number, default: 1 },
284
+ step: { type: Number, default: 1 },
285
+ minWidth: { type: Number, default: 1 },
286
+ canOverlap: { type: Boolean, default: true },
287
+ disabled: { type: Boolean, default: false }
288
+ },
289
+ components: {
290
+ Bar,
291
+ Label,
292
+ Labels,
293
+ Ruler,
294
+ Slider,
295
+ AddIcon,
296
+ SubRuler,
297
+ BarSlider,
298
+ RulerRule,
299
+ HandleIcon,
300
+ BarWrapper,
301
+ ErrorMessage,
302
+ RulerSubRule,
303
+ BarContainer,
304
+ SliderWrapper,
305
+ VerticalLabel,
306
+ RangeSliderContainer,
307
+ BarOptionsContainer,
308
+ BarItemContainer,
309
+ BarItemText
310
+ },
311
+ data() {
312
+ return {
313
+ showBarOptions: false,
314
+ barOptionsPosition: { x: 0, y: 0 },
315
+ barOptionsList: [],
316
+ barOptionsType: null, // can be "add" or "delete"
317
+ activeLabel: null,
318
+ activeItem: null,
319
+ OverlapId: [],
320
+ hasOverlap: false
321
+ }
322
+ },
323
+ computed: {
324
+ maximum() {
325
+ if (!this.labels.length) return
326
+
327
+ return this.topLabels.at(-1)
328
+ },
329
+ minimum() {
330
+ if (!this.labels.length) return
331
+
332
+ return this.topLabels[0]
333
+ },
334
+ topLabels() {
335
+ if (!this.labels.length) return
336
+ const labels = this.labels.find((label) => label.placement === 'top')
337
+
338
+ return labels ? labels.value : []
339
+ },
340
+ leftLabels() {
341
+ if (!this.labels.length) return
342
+ const labels = this.labels.find((label) => label.placement === 'left')
343
+ return labels ? labels.value : []
344
+ },
345
+ stepCount() {
346
+ let labels = this.topLabels || []
347
+
348
+ if (labels.length) {
349
+ return labels.length - 1
350
+ }
351
+
352
+ return Math.floor((this.maximum - this.minimum) / this.step)
353
+ },
354
+ subStepCount() {
355
+ let labels = this.topLabels || []
356
+
357
+ if (labels.length && this.step) {
358
+ return (this.maximum - this.minimum) / this.step
359
+ }
360
+
361
+ return 0
362
+ }
363
+ },
364
+ methods: {
365
+ onChange(type, value) {
366
+ this.$emit(type, value)
367
+ },
368
+ checkOverlap(value, tariffs) {
369
+ // Check if the tariffs overlap
370
+ const min = parseFloat(value.min)
371
+ const max = parseFloat(value.max)
372
+
373
+ return tariffs.some((tariff) => {
374
+ if (tariff.id === value.itemId || tariff.id === value.id) return false
375
+
376
+ return (
377
+ min === tariff.min ||
378
+ max === tariff.max ||
379
+ (min > tariff.min && min < tariff.max) ||
380
+ (max > tariff.min && max < tariff.max) ||
381
+ (min < tariff.min && max > tariff.max)
382
+ )
383
+ })
384
+ },
385
+ barOptionLabel(value) {
386
+ if (this.barOptionsType === 'add')
387
+ return `${this.$gettext('Add')} ${value}`
388
+
389
+ return `${this.$gettext('Remove')} ${value}`
390
+ },
391
+ onActivateBar({ item }) {
392
+ this.$emit('activate')
393
+ this.activeItem = item
394
+ document.addEventListener('keydown', this.onKeyDownDelete)
395
+ },
396
+ onDeactivateBar() {
397
+ this.$emit('deactivate')
398
+ this.activeItem = null
399
+ document.removeEventListener('keydown', this.onKeyDownDelete)
400
+ },
401
+ onKeyDownDelete(event) {
402
+ // Check if the pressed key is the Delete or Backspace key
403
+ if (
404
+ (event.key === 'Delete' || event.key === 'Backspace') &&
405
+ this.activeItem
406
+ ) {
407
+ this.$emit('on-bar-tariff-click', {
408
+ type: 'delete',
409
+ item: this.activeItem,
410
+ label: this.activeLabel
411
+ })
412
+ this.activeItem = null
413
+ }
414
+ },
415
+ onBarTariffClick({ item, type, label }) {
416
+ if (this.disabled) return
417
+
418
+ this.$emit('on-bar-tariff-click', {
419
+ type,
420
+ item,
421
+ label
422
+ })
423
+
424
+ this.activeLabel = label
425
+ this.barOptionsType = type
426
+ this.showBarOptions = false
427
+ },
428
+ setBarOptions(bar) {
429
+ this.barOptionsList = []
430
+
431
+ if (this.barOptionsType === 'add') {
432
+ this.tariffItems.forEach((item) => {
433
+ if (item.name && item.name.length) {
434
+ this.barOptionsList.push(item)
435
+ }
436
+ })
437
+ } else {
438
+ // add based on the index in the chart.
439
+ this.barOptionsList.push({
440
+ name: bar.name,
441
+ id: bar.id
442
+ })
443
+ }
444
+ },
445
+ onBarRightClick({ event, label, type, bar }) {
446
+ if (this.disabled) return
447
+
448
+ // type can be "add", "delete"
449
+ // if "add", show all tariffItems for the group
450
+ // if "delete", only show the delete with the tariff name
451
+ event.preventDefault()
452
+ this.activeLabel = label
453
+ this.barOptionsType = type
454
+ this.setBarOptions(bar)
455
+
456
+ if (this.barOptionsList.length) {
457
+ this.showBarOptions = true
458
+ this.barOptionsPosition = { x: event.clientX, y: event.clientY }
459
+ document.addEventListener('click', this.handleOutsideClick)
460
+ } else {
461
+ this.showBarOptions = false
462
+ }
463
+ },
464
+ handleOutsideClick(event) {
465
+ // Check if the click occurred outside the dropdown
466
+ if (
467
+ this.$refs.barDropdown &&
468
+ !this.$refs.barDropdown.$el.contains(event.target)
469
+ ) {
470
+ // Hide the dropdown
471
+ this.showBarOptions = false
472
+ // Remove the global click event listener
473
+ document.removeEventListener('click', this.handleOutsideClick)
474
+ }
475
+ }
476
+ },
477
+ beforeDestroy() {
478
+ // Remove the global click event listener to prevent memory leaks
479
+ document.removeEventListener('click', this.handleOutsideClick)
480
+ document.removeEventListener('keydown', this.onKeyDownDelete)
481
+ },
482
+ watch: {
483
+ labels(newVal, oldVal) {
484
+ const overlapContainer = []
485
+
486
+ //check items for overlap
487
+ if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
488
+ const labels = newVal.find((label) => label.placement === 'left')
489
+
490
+ if (labels) {
491
+ labels.value.forEach((label) => {
492
+ label.selectedTariffs.forEach((tariff) => {
493
+ const hasOverlap = this.checkOverlap(
494
+ tariff,
495
+ label.selectedTariffs
496
+ )
497
+
498
+ if (hasOverlap) overlapContainer.push(label.id)
499
+ })
500
+ })
501
+ }
502
+
503
+ const hasOverlap = overlapContainer.length > 0
504
+
505
+ if (!hasOverlap) {
506
+ this.OverlapId = []
507
+ } else {
508
+ this.OverlapId = [...new Set(overlapContainer)]
509
+ }
510
+
511
+ this.hasOverlap = hasOverlap
512
+ this.$emit('has-overlap', hasOverlap)
513
+ }
514
+ }
515
+ }
516
+ }
517
+ </script>