@eturnity/eturnity_reusable_components 7.33.0-EPDM-11313.0 → 7.33.0-EPDM-11205.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 (330) hide show
  1. package/.eslintrc.js +184 -184
  2. package/.prettierrc +9 -9
  3. package/.storybook/main.js +8 -8
  4. package/.storybook/preview.js +46 -46
  5. package/README.md +29 -29
  6. package/babel.config.js +5 -5
  7. package/package.json +50 -50
  8. package/postcss.config.js +6 -6
  9. package/src/App.vue +110 -110
  10. package/src/assets/icons/arrow_down.svg +3 -3
  11. package/src/assets/icons/arrow_up_red.svg +3 -3
  12. package/src/assets/icons/black_spinner.svg +35 -35
  13. package/src/assets/icons/delete_icon.svg +11 -11
  14. package/src/assets/icons/delete_icon_gray.svg +11 -11
  15. package/src/assets/icons/drag_icon.svg +8 -8
  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/_readme.md +7 -7
  29. package/src/assets/svgIcons/accept.svg +5 -5
  30. package/src/assets/svgIcons/activate_panels_active.svg +22 -22
  31. package/src/assets/svgIcons/activate_panels_inactive.svg +20 -20
  32. package/src/assets/svgIcons/add_icon-1.svg +3 -3
  33. package/src/assets/svgIcons/add_icon.svg +4 -4
  34. package/src/assets/svgIcons/address_book.svg +3 -3
  35. package/src/assets/svgIcons/after_sale_as_a_service.svg +6 -6
  36. package/src/assets/svgIcons/all_good.svg +3 -3
  37. package/src/assets/svgIcons/angle_active.svg +5 -5
  38. package/src/assets/svgIcons/angle_inactive.svg +4 -4
  39. package/src/assets/svgIcons/area_active.svg +11 -11
  40. package/src/assets/svgIcons/area_inactive.svg +26 -26
  41. package/src/assets/svgIcons/areas_tool.svg +14 -14
  42. package/src/assets/svgIcons/arrow_down.svg +3 -3
  43. package/src/assets/svgIcons/arrow_left.svg +4 -4
  44. package/src/assets/svgIcons/arrow_right.svg +4 -4
  45. package/src/assets/svgIcons/arrow_up.svg +3 -3
  46. package/src/assets/svgIcons/attachment.svg +3 -3
  47. package/src/assets/svgIcons/base_layer.svg +3 -3
  48. package/src/assets/svgIcons/battery.svg +3 -3
  49. package/src/assets/svgIcons/bell.svg +3 -3
  50. package/src/assets/svgIcons/bexio.svg +4 -4
  51. package/src/assets/svgIcons/bold.svg +3 -3
  52. package/src/assets/svgIcons/bom.svg +3 -3
  53. package/src/assets/svgIcons/bom_generation.svg +10 -10
  54. package/src/assets/svgIcons/bookmaker.svg +3 -3
  55. package/src/assets/svgIcons/bubble.svg +3 -3
  56. package/src/assets/svgIcons/bug.svg +5 -5
  57. package/src/assets/svgIcons/buildings.svg +55 -0
  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/lake.svg +29 -0
  150. package/src/assets/svgIcons/layers_close.svg +4 -4
  151. package/src/assets/svgIcons/layers_open.svg +4 -4
  152. package/src/assets/svgIcons/lead_marketplace.svg +6 -6
  153. package/src/assets/svgIcons/lead_provider.svg +4 -4
  154. package/src/assets/svgIcons/length_2d.svg +2 -2
  155. package/src/assets/svgIcons/length_3d.svg +4 -4
  156. package/src/assets/svgIcons/length_calculator.svg +2 -2
  157. package/src/assets/svgIcons/length_in_2d_active.svg +12 -12
  158. package/src/assets/svgIcons/length_in_2d_inctive.svg +13 -13
  159. package/src/assets/svgIcons/light_bulb.svg +3 -3
  160. package/src/assets/svgIcons/like.svg +3 -3
  161. package/src/assets/svgIcons/line_graph.svg +3 -3
  162. package/src/assets/svgIcons/local_subsidies.svg +18 -18
  163. package/src/assets/svgIcons/location.svg +3 -3
  164. package/src/assets/svgIcons/lock.svg +3 -3
  165. package/src/assets/svgIcons/logout.svg +3 -3
  166. package/src/assets/svgIcons/loop.svg +3 -3
  167. package/src/assets/svgIcons/low-vegetation.svg +37 -0
  168. package/src/assets/svgIcons/lunch.svg +4 -4
  169. package/src/assets/svgIcons/magic_tool.svg +6 -6
  170. package/src/assets/svgIcons/map_icon.svg +5 -5
  171. package/src/assets/svgIcons/map_settings.svg +3 -3
  172. package/src/assets/svgIcons/margin_tool.svg +4 -4
  173. package/src/assets/svgIcons/meeting.svg +6 -6
  174. package/src/assets/svgIcons/move_copy.svg +4 -4
  175. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  176. package/src/assets/svgIcons/next.svg +4 -4
  177. package/src/assets/svgIcons/normal-tg.svg +30 -0
  178. package/src/assets/svgIcons/normal-vegetation.svg +53 -0
  179. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  180. package/src/assets/svgIcons/numbered_list.svg +6 -6
  181. package/src/assets/svgIcons/obstacle_tool.svg +9 -9
  182. package/src/assets/svgIcons/obstacle_tool_origin.svg +3 -3
  183. package/src/assets/svgIcons/offset_tool.svg +8 -8
  184. package/src/assets/svgIcons/open-tg.svg +21 -0
  185. package/src/assets/svgIcons/outline_tool.svg +11 -11
  186. package/src/assets/svgIcons/pan_tool.svg +12 -12
  187. package/src/assets/svgIcons/panels_tool.svg +8 -8
  188. package/src/assets/svgIcons/pen_tool.svg +4 -4
  189. package/src/assets/svgIcons/picker_tool.svg +4 -4
  190. package/src/assets/svgIcons/picture.svg +3 -3
  191. package/src/assets/svgIcons/pin.svg +5 -5
  192. package/src/assets/svgIcons/presentation.svg +3 -3
  193. package/src/assets/svgIcons/previous.svg +4 -4
  194. package/src/assets/svgIcons/profile-1.svg +4 -4
  195. package/src/assets/svgIcons/profile.svg +4 -4
  196. package/src/assets/svgIcons/profitability.svg +3 -3
  197. package/src/assets/svgIcons/project_analysis.svg +4 -4
  198. package/src/assets/svgIcons/project_settings.svg +4 -4
  199. package/src/assets/svgIcons/protected-tg.svg +47 -0
  200. package/src/assets/svgIcons/pv.svg +3 -3
  201. package/src/assets/svgIcons/quotations.svg +6 -6
  202. package/src/assets/svgIcons/redo.svg +6 -6
  203. package/src/assets/svgIcons/resizer.svg +5 -5
  204. package/src/assets/svgIcons/roof_layer.svg +3 -3
  205. package/src/assets/svgIcons/rotate_tool.svg +3 -3
  206. package/src/assets/svgIcons/rotate_view.svg +5 -5
  207. package/src/assets/svgIcons/ruler_tool.svg +3 -3
  208. package/src/assets/svgIcons/run_simulation.svg +3 -3
  209. package/src/assets/svgIcons/save.svg +3 -3
  210. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  211. package/src/assets/svgIcons/sea.svg +34 -0
  212. package/src/assets/svgIcons/search.svg +3 -3
  213. package/src/assets/svgIcons/security.svg +3 -3
  214. package/src/assets/svgIcons/settings.svg +3 -3
  215. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  216. package/src/assets/svgIcons/smartphone.svg +4 -4
  217. package/src/assets/svgIcons/solar_calc.svg +13 -13
  218. package/src/assets/svgIcons/sorting.svg +4 -4
  219. package/src/assets/svgIcons/split.svg +12 -12
  220. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  221. package/src/assets/svgIcons/strikethrough.svg +4 -4
  222. package/src/assets/svgIcons/subscriptions.svg +3 -3
  223. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  224. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  225. package/src/assets/svgIcons/subsidies.svg +3 -3
  226. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  227. package/src/assets/svgIcons/suitcase.svg +3 -3
  228. package/src/assets/svgIcons/summer.svg +3 -3
  229. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  230. package/src/assets/svgIcons/transfer.svg +4 -4
  231. package/src/assets/svgIcons/trim_tool.svg +4 -4
  232. package/src/assets/svgIcons/truck.svg +3 -3
  233. package/src/assets/svgIcons/underlined.svg +3 -3
  234. package/src/assets/svgIcons/undo.svg +6 -6
  235. package/src/assets/svgIcons/uparrow.svg +3 -3
  236. package/src/assets/svgIcons/update.svg +3 -3
  237. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  238. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  239. package/src/assets/svgIcons/upload_image.svg +8 -8
  240. package/src/assets/svgIcons/upload_image_tool.svg +7 -7
  241. package/src/assets/svgIcons/variants.svg +6 -6
  242. package/src/assets/svgIcons/vertical_tool.svg +3 -3
  243. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  244. package/src/assets/svgIcons/warning.svg +4 -4
  245. package/src/assets/svgIcons/way.svg +5 -5
  246. package/src/assets/svgIcons/wifi.svg +3 -3
  247. package/src/assets/svgIcons/winter.svg +3 -3
  248. package/src/assets/svgIcons/workflow_template.svg +11 -11
  249. package/src/assets/theme.js +41 -41
  250. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  251. package/src/components/addNewButton/index.vue +61 -61
  252. package/src/components/banner/actionBanner/index.vue +64 -64
  253. package/src/components/banner/banner/banner.stories.js +31 -31
  254. package/src/components/banner/banner/index.vue +188 -188
  255. package/src/components/banner/infoBanner/index.vue +57 -57
  256. package/src/components/buttons/buttonIcon/index.vue +145 -145
  257. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  258. package/src/components/buttons/closeButton/index.vue +61 -61
  259. package/src/components/buttons/mainButton/index.vue +140 -144
  260. package/src/components/card/index.vue +96 -96
  261. package/src/components/collapsableInfoText/index.vue +127 -127
  262. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  263. package/src/components/deleteIcon/index.vue +78 -78
  264. package/src/components/draggableInputHandle/index.vue +46 -46
  265. package/src/components/dropdown/Dropdown.stories.js +53 -53
  266. package/src/components/dropdown/index.vue +138 -138
  267. package/src/components/errorMessage/index.vue +64 -64
  268. package/src/components/filter/filterSettings.vue +639 -639
  269. package/src/components/filter/index.vue +154 -154
  270. package/src/components/filter/parentDropdown.vue +91 -91
  271. package/src/components/icon/Icons.stories.js +41 -41
  272. package/src/components/icon/iconCache.js +23 -23
  273. package/src/components/icon/iconCollection.vue +68 -68
  274. package/src/components/icon/index.vue +140 -140
  275. package/src/components/iconWrapper/index.vue +179 -179
  276. package/src/components/infoCard/index.vue +40 -40
  277. package/src/components/infoText/index.vue +170 -170
  278. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  279. package/src/components/inputs/checkbox/index.vue +224 -224
  280. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  281. package/src/components/inputs/inputNumber/index.vue +789 -789
  282. package/src/components/inputs/inputNumberQuestion/index.vue +218 -218
  283. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  284. package/src/components/inputs/inputText/index.vue +376 -376
  285. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  286. package/src/components/inputs/radioButton/index.vue +273 -273
  287. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  288. package/src/components/inputs/searchInput/index.vue +151 -151
  289. package/src/components/inputs/select/index.vue +908 -908
  290. package/src/components/inputs/select/option/index.vue +148 -148
  291. package/src/components/inputs/select/select.stories.js +58 -58
  292. package/src/components/inputs/slider/index.vue +126 -126
  293. package/src/components/inputs/switchField/index.vue +254 -254
  294. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  295. package/src/components/inputs/textAreaInput/index.vue +198 -198
  296. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  297. package/src/components/inputs/toggle/index.vue +285 -285
  298. package/src/components/label/index.vue +99 -99
  299. package/src/components/markerItem/index.vue +88 -88
  300. package/src/components/modals/actionModal/index.vue +64 -64
  301. package/src/components/modals/infoModal/index.vue +52 -52
  302. package/src/components/modals/modal/index.vue +188 -188
  303. package/src/components/modals/modal/modal.stories.js +31 -31
  304. package/src/components/navigationTabs/index.vue +114 -114
  305. package/src/components/pageSubtitle/index.vue +67 -67
  306. package/src/components/pageTitle/index.vue +68 -68
  307. package/src/components/pagination/index.vue +148 -148
  308. package/src/components/progressBar/index.vue +125 -125
  309. package/src/components/projectMarker/index.vue +300 -300
  310. package/src/components/rangeSlider/Slider.vue +573 -573
  311. package/src/components/rangeSlider/index.vue +517 -517
  312. package/src/components/rangeSlider/utils/dom.js +49 -49
  313. package/src/components/rangeSlider/utils/fns.js +26 -26
  314. package/src/components/selectedOptions/index.vue +145 -145
  315. package/src/components/sideMenu/index.vue +270 -270
  316. package/src/components/spinner/index.vue +68 -68
  317. package/src/components/tableDropdown/index.vue +638 -638
  318. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  319. package/src/components/tables/mainTable/index.vue +510 -510
  320. package/src/components/tables/viewTable/index.vue +195 -195
  321. package/src/components/tabsHeader/index.vue +83 -83
  322. package/src/components/threeDots/index.vue +413 -413
  323. package/src/components/videoThumbnail/index.vue +103 -103
  324. package/src/components/videoThumbnail/videoThumbnail.stories.js +33 -33
  325. package/src/helpers/currencyMapping.js +28 -28
  326. package/src/helpers/numberConverter.js +103 -103
  327. package/src/helpers/translateLang.js +128 -128
  328. package/src/main.js +6 -6
  329. package/src/mixins/inputValidations.js +97 -97
  330. package/src/utils/index.js +12 -12
@@ -1,639 +1,639 @@
1
- <template>
2
- <ContainerWrapper @click="$emit('on-container-click')">
3
- <UpperContainer v-if="filterViews && filterViews.length">
4
- <ViewContainer :max-width="activeView.length">
5
- <SelectComponent
6
- align-items="vertical"
7
- font-size="13px"
8
- :label="$gettext('active_filter')"
9
- select-height="36px"
10
- select-width="100%"
11
- @click.stop
12
- >
13
- <template #selector>
14
- <OptionTitle>
15
- {{ activeView }}
16
- </OptionTitle>
17
- </template>
18
- <template #dropdown>
19
- <Option
20
- v-for="(item, idx) in filterViews"
21
- :key="idx + '_view'"
22
- :value="item.name"
23
- @click="$emit('on-view-select', item)"
24
- >
25
- {{ item.name }}
26
- <DeleteIcon @click.stop="$emit('on-view-delete', item)" />
27
- </Option>
28
- </template>
29
- </SelectComponent>
30
- </ViewContainer>
31
- <ResetButton @click="$emit('on-reset-filters')">
32
- <Icon :color="theme.colors.blue" :name="'update'" size="14px" />
33
- <div>{{ $gettext('reset_filters') }}</div>
34
- </ResetButton>
35
- </UpperContainer>
36
- <ColumnWrapper
37
- :has-active-view="!!filterViews && !!filterViews.length"
38
- :num-cols="filterData.length"
39
- >
40
- <ColumnContainer
41
- v-for="(item, idx) in filterData"
42
- :key="idx + '_filterdata'"
43
- >
44
- <ColumnTitle
45
- :data-id="`filter_label_project_view_file_manager_${item.type}`"
46
- :show-border="idx + 1 !== filterData.length"
47
- >
48
- {{ item.columnName }}
49
- </ColumnTitle>
50
- <RowContainer v-if="item.type === 'columns'">
51
- <CheckboxContainer>
52
- <Draggable
53
- v-model="item.dataOptions"
54
- ghost-class="ghost"
55
- handle=".drag-container"
56
- item-key="choice"
57
- :set-data="modifyDragItem"
58
- style="display: contents"
59
- @change="onDragChange({ data: item.dataOptions })"
60
- >
61
- <template #item="{ element: column }">
62
- <CheckboxWrapper>
63
- <DragContainer class="drag-container">
64
- <Icon :name="'duplicate-1'" size="12px" />
65
- </DragContainer>
66
- <Checkbox
67
- :is-checked="column.selected"
68
- :is-disabled="column.selected && isCheckboxDisabled"
69
- :label="column.text"
70
- size="small"
71
- @on-event-handler="
72
- onChange({
73
- dataType: item.type,
74
- value: $event,
75
- choice: column.choice,
76
- })
77
- "
78
- />
79
- </CheckboxWrapper>
80
- </template>
81
- </Draggable>
82
- </CheckboxContainer>
83
- </RowContainer>
84
- <RowContainer v-if="item.type === 'filter'" show-border>
85
- <RowWrapper
86
- v-for="(filter, index) in item.dataOptions"
87
- :key="index + '_field'"
88
- >
89
- <SelectComponent
90
- v-if="isMultipleSelector(filter.filter_type)"
91
- align-items="vertical"
92
- :disabled="!filter.choices.length"
93
- font-size="13px"
94
- :is-searchable="filter.choices.length > 7"
95
- :label="filter.label"
96
- :label-data-id="filter.dataId"
97
- :min-option-length="1"
98
- select-height="36px"
99
- select-width="100%"
100
- >
101
- <template #selector>
102
- <OptionTitle> {{ filter.selectedText }} </OptionTitle>
103
- </template>
104
- <template #dropdown>
105
- <DropdownCheckboxContainer
106
- v-for="(filterOption, optionIdx) in filter.choices"
107
- :key="optionIdx + 'optionIdx'"
108
- @click.stop
109
- >
110
- <Checkbox
111
- :is-checked="filterOption.selected"
112
- :label="filterOption.text"
113
- size="small"
114
- @on-event-handler="
115
- onChange({
116
- dataType: item.type,
117
- value: $event,
118
- choice: filterOption.choice,
119
- field: filter.field,
120
- })
121
- "
122
- />
123
- </DropdownCheckboxContainer>
124
- </template>
125
- </SelectComponent>
126
- <SectionContainer v-else-if="isRangeSelector(filter.filter_type)">
127
- <RowLabel :data-id="filter.dataId">
128
- {{ filter.label }}
129
- </RowLabel>
130
- <GridContainer>
131
- <InputNumber
132
- font-size="13px"
133
- input-height="36px"
134
- :number-precision="isIntegerRange(filter.filter_type) ? 0 : 2"
135
- :placeholder="
136
- filter.unit
137
- ? $gettext('min') + ' (' + filter.unit + ')'
138
- : $gettext('min')
139
- "
140
- :unit-name="filter.unit"
141
- :value="filter.range.start"
142
- @input-change="
143
- onChange({
144
- dataType: item.type,
145
- value: $event,
146
- choice: 'start',
147
- field: filter.field,
148
- })
149
- "
150
- />
151
- <InputNumber
152
- font-size="13px"
153
- input-height="36px"
154
- :number-precision="isIntegerRange(filter.filter_type) ? 0 : 2"
155
- :placeholder="
156
- filter.unit
157
- ? $gettext('max') + ' (' + filter.unit + ')'
158
- : $gettext('max')
159
- "
160
- :unit-name="filter.unit"
161
- :value="filter.range.end"
162
- @input-change="
163
- onChange({
164
- dataType: item.type,
165
- value: $event,
166
- choice: 'end',
167
- field: filter.field,
168
- })
169
- "
170
- />
171
- </GridContainer>
172
- </SectionContainer>
173
- <SectionContainer
174
- v-else-if="isDateSelector(filter.filter_type)"
175
- @click.stop
176
- >
177
- <RowLabel :data-id="filter.dataId">
178
- {{ filter.label }}
179
- </RowLabel>
180
- <GridContainer>
181
- <VueDatePicker
182
- :auto-apply="true"
183
- :clearable="true"
184
- :disabled-dates="disableFutureDates"
185
- :enable-time-picker="false"
186
- format="yyyy-MM-dd"
187
- :locale="getDatePickerLanguage()"
188
- model-type="format"
189
- :model-value="filter.range.start"
190
- :placeholder="$gettext('Date from')"
191
- text-input
192
- @close="onDatepickerBlur()"
193
- @focus="onDatepickerFocus(filter.range)"
194
- @update:model-value="
195
- onChange({
196
- dataType: item.type,
197
- value: $event,
198
- choice: 'start',
199
- field: filter.field,
200
- })
201
- "
202
- />
203
- <VueDatePicker
204
- :auto-apply="true"
205
- :clearable="true"
206
- :disabled-dates="disablePastDates"
207
- :enable-time-picker="false"
208
- format="yyyy-MM-dd"
209
- :locale="getDatePickerLanguage()"
210
- model-type="format"
211
- :model-value="filter.range.end"
212
- :placeholder="$gettext('Date to')"
213
- text-input
214
- @close="onDatepickerBlur()"
215
- @focus="onDatepickerFocus(filter.range)"
216
- @update:model-value="
217
- onChange({
218
- dataType: item.type,
219
- value: $event,
220
- choice: 'end',
221
- field: filter.field,
222
- })
223
- "
224
- />
225
- </GridContainer>
226
- </SectionContainer>
227
- <SelectComponent
228
- v-else
229
- align-items="vertical"
230
- :disabled="!filter.choices.length"
231
- font-size="13px"
232
- :is-searchable="filter.choices.length > 7"
233
- :label="filter.label"
234
- select-height="36px"
235
- select-width="100%"
236
- >
237
- <template #selector="{ selectedValue }">
238
- <OptionTitle>
239
- {{
240
- getSelectedValue({
241
- value: selectedValue,
242
- options: filter.choices,
243
- filter,
244
- })
245
- }}
246
- </OptionTitle>
247
- </template>
248
- <template #dropdown>
249
- <Option
250
- v-for="(filterOption, filterIdx) in filter.choices"
251
- :key="filterIdx + '_filterIdx'"
252
- :value="filterOption.choice"
253
- >
254
- {{ filterOption.text }}
255
- </Option>
256
- </template>
257
- </SelectComponent>
258
- </RowWrapper>
259
- </RowContainer>
260
- </ColumnContainer>
261
- </ColumnWrapper>
262
- <ButtonContainer>
263
- <MainButton
264
- v-if="buttonText.apply_view"
265
- :text="buttonText.apply_view"
266
- type="primary"
267
- @click="$emit('on-apply-current-view')"
268
- />
269
- <MainButton
270
- v-if="buttonText.save_view"
271
- :text="buttonText.save_view"
272
- type="secondary"
273
- @click="$emit('on-save-new-view')"
274
- />
275
- <MainButton
276
- v-if="buttonText.cancel"
277
- :text="buttonText.cancel"
278
- type="cancel"
279
- @click="$emit('on-cancel-view')"
280
- />
281
- <ResetContainer v-if="!filterViews || !filterViews.length">
282
- <ResetButton @click="$emit('on-reset-filters')">
283
- <Icon :color="theme.colors.blue" :name="'update'" size="14px" />
284
- <div>{{ $gettext('reset_filters') }}</div>
285
- </ResetButton>
286
- </ResetContainer>
287
- </ButtonContainer>
288
- </ContainerWrapper>
289
- </template>
290
-
291
- <script>
292
- import styled from 'vue3-styled-components'
293
- import SelectComponent from '../inputs/select'
294
- import Option from '../inputs/select/option'
295
- import InputNumber from '../inputs/inputNumber'
296
- import MainButton from '../buttons/mainButton'
297
- import Checkbox from '../inputs/checkbox'
298
- import Draggable from 'vuedraggable'
299
- import Icon from '../icon'
300
- import DeleteIcon from '../deleteIcon'
301
- import { datePickerLang } from '../../helpers/translateLang'
302
- import theme from '@/assets/theme.js'
303
- import VueDatePicker from '@vuepic/vue-datepicker'
304
-
305
- const ContainerWrapper = styled.div`
306
- position: absolute;
307
- margin-top: 4px;
308
- background-color: ${(props) => props.theme.colors.white};
309
- min-width: 100%;
310
- width: max-content;
311
- border: 1px solid ${(props) => props.theme.colors.grey4};
312
- border-radius: 4px;
313
- z-index: 99999;
314
- font-size: 13px;
315
- `
316
-
317
- const ColAttrs = { numCols: Number, hasActiveView: Boolean }
318
- const ColumnWrapper = styled('div', ColAttrs)`
319
- display: grid;
320
- grid-template-columns: repeat(${(props) => props.numCols}, auto);
321
-
322
- ${({ hasActiveView, theme }) =>
323
- hasActiveView &&
324
- `
325
- border-top: 1px solid ${theme.colors.grey4};
326
- `}
327
- `
328
-
329
- const TitleAttrs = { showBorder: Boolean }
330
- const ColumnTitle = styled('div', TitleAttrs)`
331
- font-size: 14px;
332
- font-weight: 700;
333
- color: ${(props) => props.theme.colors.eturnityGrey};
334
- padding: 10px 14px;
335
- ${({ showBorder, theme }) =>
336
- showBorder &&
337
- `
338
- border-right: 1px solid ${theme.colors.grey4};
339
- `}
340
- `
341
-
342
- const ButtonContainer = styled.div`
343
- display: flex;
344
- gap: 10px;
345
- padding: 15px;
346
- `
347
-
348
- const ResetContainer = styled.div`
349
- display: grid;
350
- align-content: center;
351
- margin-left: auto;
352
- div {
353
- margin-top: 0;
354
- align-self: center;
355
- }
356
- `
357
-
358
- const ColumnContainer = styled.div``
359
-
360
- const DragContainer = styled.div`
361
- cursor: grab;
362
-
363
- &:active {
364
- cursor: grabbing;
365
- }
366
- `
367
-
368
- const RowContainer = styled('div', TitleAttrs)`
369
- padding: 10px 14px;
370
- min-width: 300px;
371
-
372
- ${({ showBorder, theme }) =>
373
- showBorder &&
374
- `
375
- border-right: 1px solid ${theme.colors.grey4};
376
- `}
377
-
378
- .ghost {
379
- opacity: 0.5;
380
- background-color: #e5fcb4;
381
- }
382
- `
383
-
384
- const OptionTitle = styled.div`
385
- cursor: pointer !important;
386
- `
387
-
388
- const CheckboxContainer = styled.div`
389
- display: grid;
390
- gap: 6px;
391
- `
392
-
393
- const CheckboxWrapper = styled.div`
394
- display: grid;
395
- grid-template-columns: auto 1fr;
396
- gap: 16px;
397
- padding: 2px;
398
- align-items: center;
399
- `
400
-
401
- const DropdownCheckboxContainer = styled.div`
402
- display: grid;
403
- gap: 6px;
404
- width: 100%;
405
- padding: 7px 10px;
406
- background: ${(props) => props.theme.colors.grey5};
407
- `
408
-
409
- const RowWrapper = styled.div`
410
- margin-bottom: 12px;
411
- `
412
-
413
- const LabelAttrs = {
414
- marginTop: Boolean,
415
- }
416
- const RowLabel = styled('div', LabelAttrs)`
417
- font-weight: 700;
418
- font-size: 13px;
419
- margin-bottom: 8px;
420
- margin-top: ${(props) => (props.marginTop ? '12px' : '0')};
421
- `
422
-
423
- const SectionContainer = styled.div``
424
-
425
- const GridContainer = styled.div`
426
- display: grid;
427
- grid-template-columns: 1fr 1fr;
428
- grid-gap: 12px;
429
- `
430
-
431
- const ViewContainerAttrs = { maxWidth: Number }
432
- const ViewContainer = styled('div', ViewContainerAttrs)`
433
- max-width: ${(props) =>
434
- props.maxWidth && props.maxWidth > 300 ? props.maxWidth + 'ch' : '300px'};
435
- `
436
-
437
- const UpperContainer = styled.div`
438
- display: grid;
439
- grid-gap: 20px
440
- grid-template-columns: 1fr 1fr;
441
- padding: 10px 14px;
442
- `
443
-
444
- const ResetButton = styled.div`
445
- display: inline-flex;
446
- gap: 16px;
447
- width: max-content;
448
- margin-top: 20px;
449
- align-self: center;
450
- font-size: 13px;
451
- color: ${(props) => props.theme.colors.blue};
452
- cursor: pointer;
453
- `
454
-
455
- export default {
456
- name: 'FilterSettings',
457
- components: {
458
- ContainerWrapper,
459
- ColumnWrapper,
460
- ColumnTitle,
461
- ColumnContainer,
462
- SelectComponent,
463
- RowContainer,
464
- OptionTitle,
465
- Option,
466
- ButtonContainer,
467
- MainButton,
468
- CheckboxContainer,
469
- CheckboxWrapper,
470
- Checkbox,
471
- RowWrapper,
472
- DropdownCheckboxContainer,
473
- Draggable,
474
- Icon,
475
- DragContainer,
476
- InputNumber,
477
- RowLabel,
478
- SectionContainer,
479
- GridContainer,
480
- ViewContainer,
481
- DeleteIcon,
482
- UpperContainer,
483
- ResetButton,
484
- ResetContainer,
485
- VueDatePicker,
486
- },
487
- props: {
488
- filterData: {
489
- required: true,
490
- },
491
- hasActiveView: {
492
- required: false,
493
- },
494
- buttonText: {
495
- required: true,
496
- // example:
497
- // {
498
- // 'save_new_view': '$gettext("save_new_view")',
499
- // 'cancel': '$gettext("cancel")',
500
- // 'save_view': '$gettext("save_view")'
501
- // }
502
- },
503
- filterViews: {
504
- required: true,
505
- },
506
- activeLanguage: {
507
- required: false,
508
- },
509
- settingsTranslations: {
510
- required: false,
511
- },
512
- activeView: {
513
- required: false,
514
- },
515
- },
516
- data() {
517
- return {
518
- selectedDates: null,
519
- value1: null,
520
- dateStart: null,
521
- dateEnd: null,
522
- }
523
- },
524
- computed: {
525
- isCheckboxDisabled() {
526
- // if only 1 item left, disable checkbox
527
- let isDisabled = false
528
- let columnsData = this.filterData.filter(
529
- (item) => item.type === 'columns'
530
- )
531
- if (columnsData.length) {
532
- columnsData = columnsData[0]
533
- const filteredColumns = columnsData.dataOptions.filter(
534
- (item) => item.selected
535
- )
536
- if (filteredColumns.length === 1) {
537
- isDisabled = true
538
- }
539
- }
540
- return isDisabled
541
- },
542
- theme() {
543
- return theme
544
- },
545
- },
546
- methods: {
547
- onChange({ dataType, value, choice, field }) {
548
- if (
549
- dataType === 'columns' &&
550
- this.isCheckboxDisabled &&
551
- value === false
552
- ) {
553
- return
554
- }
555
- const data = { dataType, value, choice, field }
556
- this.$emit('on-filter-change', data)
557
- },
558
- onDatepickerFocus(range) {
559
- this.dateStart = range.start
560
- this.dateEnd = range.end
561
- this.$emit('on-prevent-close', true)
562
- },
563
- onDatepickerBlur() {
564
- this.$emit('on-prevent-close', false)
565
- },
566
- disablePastDates(date) {
567
- const dateString = this.dateStart
568
- if (!dateString) {
569
- return
570
- }
571
- const dateParts = dateString.split('-')
572
-
573
- const year = parseInt(dateParts[0])
574
- const month = parseInt(dateParts[1]) - 1 // Subtract 1 since January is month 0
575
- const day = parseInt(dateParts[2])
576
-
577
- const currentDate = new Date(year, month, day)
578
- const selectedDate = new Date(date)
579
-
580
- // Disable dates that are greater than or equal to the current date
581
- return selectedDate <= currentDate
582
- },
583
- disableFutureDates(date) {
584
- const dateString = this.dateEnd
585
- if (!dateString) {
586
- return
587
- }
588
- const dateParts = dateString.split('-')
589
-
590
- const year = parseInt(dateParts[0])
591
- const month = parseInt(dateParts[1]) - 1 // Subtract 1 since January is month 0
592
- const day = parseInt(dateParts[2])
593
-
594
- const currentDate = new Date(year, month, day)
595
- const selectedDate = new Date(date)
596
-
597
- // Disable dates that are greater than or equal to the current date
598
- return selectedDate >= currentDate
599
- },
600
- getDatePickerLanguage() {
601
- return datePickerLang(this.activeLanguage)
602
- },
603
- onDragChange({ data }) {
604
- this.$emit('on-drag-change', data)
605
- },
606
- modifyDragItem(dataTransfer) {
607
- const isSafari = /^((?!chrome|android).)*safari/i.test(
608
- navigator.userAgent
609
- )
610
- // prevents the dragged element from dragging the whole row as a "ghost"
611
- // Safari fix because this does not work on Safari
612
- let img = new Image()
613
- if (!isSafari) {
614
- dataTransfer.setDragImage(img, 0, 0)
615
- } else {
616
- img.src =
617
- 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
618
- dataTransfer.setDragImage(img, 0, 0)
619
- }
620
- },
621
- getSelectedValue({ value, options, filter }) {
622
- const foundItem = options.find((item) => item.choice === value)
623
- return foundItem ? foundItem.text : value ? value : filter.selectedText
624
- },
625
- isMultipleSelector(type) {
626
- return type === 'multi_select_integer' || type === 'multi_select_string'
627
- },
628
- isRangeSelector(type) {
629
- return type === 'integer_range' || type === 'number_range'
630
- },
631
- isIntegerRange(type) {
632
- return type === 'integer_range'
633
- },
634
- isDateSelector(type) {
635
- return type === 'datetime'
636
- },
637
- },
638
- }
639
- </script>
1
+ <template>
2
+ <ContainerWrapper @click="$emit('on-container-click')">
3
+ <UpperContainer v-if="filterViews && filterViews.length">
4
+ <ViewContainer :max-width="activeView.length">
5
+ <SelectComponent
6
+ align-items="vertical"
7
+ font-size="13px"
8
+ :label="$gettext('active_filter')"
9
+ select-height="36px"
10
+ select-width="100%"
11
+ @click.stop
12
+ >
13
+ <template #selector>
14
+ <OptionTitle>
15
+ {{ activeView }}
16
+ </OptionTitle>
17
+ </template>
18
+ <template #dropdown>
19
+ <Option
20
+ v-for="(item, idx) in filterViews"
21
+ :key="idx + '_view'"
22
+ :value="item.name"
23
+ @click="$emit('on-view-select', item)"
24
+ >
25
+ {{ item.name }}
26
+ <DeleteIcon @click.stop="$emit('on-view-delete', item)" />
27
+ </Option>
28
+ </template>
29
+ </SelectComponent>
30
+ </ViewContainer>
31
+ <ResetButton @click="$emit('on-reset-filters')">
32
+ <Icon :color="theme.colors.blue" :name="'update'" size="14px" />
33
+ <div>{{ $gettext('reset_filters') }}</div>
34
+ </ResetButton>
35
+ </UpperContainer>
36
+ <ColumnWrapper
37
+ :has-active-view="!!filterViews && !!filterViews.length"
38
+ :num-cols="filterData.length"
39
+ >
40
+ <ColumnContainer
41
+ v-for="(item, idx) in filterData"
42
+ :key="idx + '_filterdata'"
43
+ >
44
+ <ColumnTitle
45
+ :data-id="`filter_label_project_view_file_manager_${item.type}`"
46
+ :show-border="idx + 1 !== filterData.length"
47
+ >
48
+ {{ item.columnName }}
49
+ </ColumnTitle>
50
+ <RowContainer v-if="item.type === 'columns'">
51
+ <CheckboxContainer>
52
+ <Draggable
53
+ v-model="item.dataOptions"
54
+ ghost-class="ghost"
55
+ handle=".drag-container"
56
+ item-key="choice"
57
+ :set-data="modifyDragItem"
58
+ style="display: contents"
59
+ @change="onDragChange({ data: item.dataOptions })"
60
+ >
61
+ <template #item="{ element: column }">
62
+ <CheckboxWrapper>
63
+ <DragContainer class="drag-container">
64
+ <Icon :name="'duplicate-1'" size="12px" />
65
+ </DragContainer>
66
+ <Checkbox
67
+ :is-checked="column.selected"
68
+ :is-disabled="column.selected && isCheckboxDisabled"
69
+ :label="column.text"
70
+ size="small"
71
+ @on-event-handler="
72
+ onChange({
73
+ dataType: item.type,
74
+ value: $event,
75
+ choice: column.choice,
76
+ })
77
+ "
78
+ />
79
+ </CheckboxWrapper>
80
+ </template>
81
+ </Draggable>
82
+ </CheckboxContainer>
83
+ </RowContainer>
84
+ <RowContainer v-if="item.type === 'filter'" show-border>
85
+ <RowWrapper
86
+ v-for="(filter, index) in item.dataOptions"
87
+ :key="index + '_field'"
88
+ >
89
+ <SelectComponent
90
+ v-if="isMultipleSelector(filter.filter_type)"
91
+ align-items="vertical"
92
+ :disabled="!filter.choices.length"
93
+ font-size="13px"
94
+ :is-searchable="filter.choices.length > 7"
95
+ :label="filter.label"
96
+ :label-data-id="filter.dataId"
97
+ :min-option-length="1"
98
+ select-height="36px"
99
+ select-width="100%"
100
+ >
101
+ <template #selector>
102
+ <OptionTitle> {{ filter.selectedText }} </OptionTitle>
103
+ </template>
104
+ <template #dropdown>
105
+ <DropdownCheckboxContainer
106
+ v-for="(filterOption, optionIdx) in filter.choices"
107
+ :key="optionIdx + 'optionIdx'"
108
+ @click.stop
109
+ >
110
+ <Checkbox
111
+ :is-checked="filterOption.selected"
112
+ :label="filterOption.text"
113
+ size="small"
114
+ @on-event-handler="
115
+ onChange({
116
+ dataType: item.type,
117
+ value: $event,
118
+ choice: filterOption.choice,
119
+ field: filter.field,
120
+ })
121
+ "
122
+ />
123
+ </DropdownCheckboxContainer>
124
+ </template>
125
+ </SelectComponent>
126
+ <SectionContainer v-else-if="isRangeSelector(filter.filter_type)">
127
+ <RowLabel :data-id="filter.dataId">
128
+ {{ filter.label }}
129
+ </RowLabel>
130
+ <GridContainer>
131
+ <InputNumber
132
+ font-size="13px"
133
+ input-height="36px"
134
+ :number-precision="isIntegerRange(filter.filter_type) ? 0 : 2"
135
+ :placeholder="
136
+ filter.unit
137
+ ? $gettext('min') + ' (' + filter.unit + ')'
138
+ : $gettext('min')
139
+ "
140
+ :unit-name="filter.unit"
141
+ :value="filter.range.start"
142
+ @input-change="
143
+ onChange({
144
+ dataType: item.type,
145
+ value: $event,
146
+ choice: 'start',
147
+ field: filter.field,
148
+ })
149
+ "
150
+ />
151
+ <InputNumber
152
+ font-size="13px"
153
+ input-height="36px"
154
+ :number-precision="isIntegerRange(filter.filter_type) ? 0 : 2"
155
+ :placeholder="
156
+ filter.unit
157
+ ? $gettext('max') + ' (' + filter.unit + ')'
158
+ : $gettext('max')
159
+ "
160
+ :unit-name="filter.unit"
161
+ :value="filter.range.end"
162
+ @input-change="
163
+ onChange({
164
+ dataType: item.type,
165
+ value: $event,
166
+ choice: 'end',
167
+ field: filter.field,
168
+ })
169
+ "
170
+ />
171
+ </GridContainer>
172
+ </SectionContainer>
173
+ <SectionContainer
174
+ v-else-if="isDateSelector(filter.filter_type)"
175
+ @click.stop
176
+ >
177
+ <RowLabel :data-id="filter.dataId">
178
+ {{ filter.label }}
179
+ </RowLabel>
180
+ <GridContainer>
181
+ <VueDatePicker
182
+ :auto-apply="true"
183
+ :clearable="true"
184
+ :disabled-dates="disableFutureDates"
185
+ :enable-time-picker="false"
186
+ format="yyyy-MM-dd"
187
+ :locale="getDatePickerLanguage()"
188
+ model-type="format"
189
+ :model-value="filter.range.start"
190
+ :placeholder="$gettext('Date from')"
191
+ text-input
192
+ @close="onDatepickerBlur()"
193
+ @focus="onDatepickerFocus(filter.range)"
194
+ @update:model-value="
195
+ onChange({
196
+ dataType: item.type,
197
+ value: $event,
198
+ choice: 'start',
199
+ field: filter.field,
200
+ })
201
+ "
202
+ />
203
+ <VueDatePicker
204
+ :auto-apply="true"
205
+ :clearable="true"
206
+ :disabled-dates="disablePastDates"
207
+ :enable-time-picker="false"
208
+ format="yyyy-MM-dd"
209
+ :locale="getDatePickerLanguage()"
210
+ model-type="format"
211
+ :model-value="filter.range.end"
212
+ :placeholder="$gettext('Date to')"
213
+ text-input
214
+ @close="onDatepickerBlur()"
215
+ @focus="onDatepickerFocus(filter.range)"
216
+ @update:model-value="
217
+ onChange({
218
+ dataType: item.type,
219
+ value: $event,
220
+ choice: 'end',
221
+ field: filter.field,
222
+ })
223
+ "
224
+ />
225
+ </GridContainer>
226
+ </SectionContainer>
227
+ <SelectComponent
228
+ v-else
229
+ align-items="vertical"
230
+ :disabled="!filter.choices.length"
231
+ font-size="13px"
232
+ :is-searchable="filter.choices.length > 7"
233
+ :label="filter.label"
234
+ select-height="36px"
235
+ select-width="100%"
236
+ >
237
+ <template #selector="{ selectedValue }">
238
+ <OptionTitle>
239
+ {{
240
+ getSelectedValue({
241
+ value: selectedValue,
242
+ options: filter.choices,
243
+ filter,
244
+ })
245
+ }}
246
+ </OptionTitle>
247
+ </template>
248
+ <template #dropdown>
249
+ <Option
250
+ v-for="(filterOption, filterIdx) in filter.choices"
251
+ :key="filterIdx + '_filterIdx'"
252
+ :value="filterOption.choice"
253
+ >
254
+ {{ filterOption.text }}
255
+ </Option>
256
+ </template>
257
+ </SelectComponent>
258
+ </RowWrapper>
259
+ </RowContainer>
260
+ </ColumnContainer>
261
+ </ColumnWrapper>
262
+ <ButtonContainer>
263
+ <MainButton
264
+ v-if="buttonText.apply_view"
265
+ :text="buttonText.apply_view"
266
+ type="primary"
267
+ @click="$emit('on-apply-current-view')"
268
+ />
269
+ <MainButton
270
+ v-if="buttonText.save_view"
271
+ :text="buttonText.save_view"
272
+ type="secondary"
273
+ @click="$emit('on-save-new-view')"
274
+ />
275
+ <MainButton
276
+ v-if="buttonText.cancel"
277
+ :text="buttonText.cancel"
278
+ type="cancel"
279
+ @click="$emit('on-cancel-view')"
280
+ />
281
+ <ResetContainer v-if="!filterViews || !filterViews.length">
282
+ <ResetButton @click="$emit('on-reset-filters')">
283
+ <Icon :color="theme.colors.blue" :name="'update'" size="14px" />
284
+ <div>{{ $gettext('reset_filters') }}</div>
285
+ </ResetButton>
286
+ </ResetContainer>
287
+ </ButtonContainer>
288
+ </ContainerWrapper>
289
+ </template>
290
+
291
+ <script>
292
+ import styled from 'vue3-styled-components'
293
+ import SelectComponent from '../inputs/select'
294
+ import Option from '../inputs/select/option'
295
+ import InputNumber from '../inputs/inputNumber'
296
+ import MainButton from '../buttons/mainButton'
297
+ import Checkbox from '../inputs/checkbox'
298
+ import Draggable from 'vuedraggable'
299
+ import Icon from '../icon'
300
+ import DeleteIcon from '../deleteIcon'
301
+ import { datePickerLang } from '../../helpers/translateLang'
302
+ import theme from '@/assets/theme.js'
303
+ import VueDatePicker from '@vuepic/vue-datepicker'
304
+
305
+ const ContainerWrapper = styled.div`
306
+ position: absolute;
307
+ margin-top: 4px;
308
+ background-color: ${(props) => props.theme.colors.white};
309
+ min-width: 100%;
310
+ width: max-content;
311
+ border: 1px solid ${(props) => props.theme.colors.grey4};
312
+ border-radius: 4px;
313
+ z-index: 99999;
314
+ font-size: 13px;
315
+ `
316
+
317
+ const ColAttrs = { numCols: Number, hasActiveView: Boolean }
318
+ const ColumnWrapper = styled('div', ColAttrs)`
319
+ display: grid;
320
+ grid-template-columns: repeat(${(props) => props.numCols}, auto);
321
+
322
+ ${({ hasActiveView, theme }) =>
323
+ hasActiveView &&
324
+ `
325
+ border-top: 1px solid ${theme.colors.grey4};
326
+ `}
327
+ `
328
+
329
+ const TitleAttrs = { showBorder: Boolean }
330
+ const ColumnTitle = styled('div', TitleAttrs)`
331
+ font-size: 14px;
332
+ font-weight: 700;
333
+ color: ${(props) => props.theme.colors.eturnityGrey};
334
+ padding: 10px 14px;
335
+ ${({ showBorder, theme }) =>
336
+ showBorder &&
337
+ `
338
+ border-right: 1px solid ${theme.colors.grey4};
339
+ `}
340
+ `
341
+
342
+ const ButtonContainer = styled.div`
343
+ display: flex;
344
+ gap: 10px;
345
+ padding: 15px;
346
+ `
347
+
348
+ const ResetContainer = styled.div`
349
+ display: grid;
350
+ align-content: center;
351
+ margin-left: auto;
352
+ div {
353
+ margin-top: 0;
354
+ align-self: center;
355
+ }
356
+ `
357
+
358
+ const ColumnContainer = styled.div``
359
+
360
+ const DragContainer = styled.div`
361
+ cursor: grab;
362
+
363
+ &:active {
364
+ cursor: grabbing;
365
+ }
366
+ `
367
+
368
+ const RowContainer = styled('div', TitleAttrs)`
369
+ padding: 10px 14px;
370
+ min-width: 300px;
371
+
372
+ ${({ showBorder, theme }) =>
373
+ showBorder &&
374
+ `
375
+ border-right: 1px solid ${theme.colors.grey4};
376
+ `}
377
+
378
+ .ghost {
379
+ opacity: 0.5;
380
+ background-color: #e5fcb4;
381
+ }
382
+ `
383
+
384
+ const OptionTitle = styled.div`
385
+ cursor: pointer !important;
386
+ `
387
+
388
+ const CheckboxContainer = styled.div`
389
+ display: grid;
390
+ gap: 6px;
391
+ `
392
+
393
+ const CheckboxWrapper = styled.div`
394
+ display: grid;
395
+ grid-template-columns: auto 1fr;
396
+ gap: 16px;
397
+ padding: 2px;
398
+ align-items: center;
399
+ `
400
+
401
+ const DropdownCheckboxContainer = styled.div`
402
+ display: grid;
403
+ gap: 6px;
404
+ width: 100%;
405
+ padding: 7px 10px;
406
+ background: ${(props) => props.theme.colors.grey5};
407
+ `
408
+
409
+ const RowWrapper = styled.div`
410
+ margin-bottom: 12px;
411
+ `
412
+
413
+ const LabelAttrs = {
414
+ marginTop: Boolean,
415
+ }
416
+ const RowLabel = styled('div', LabelAttrs)`
417
+ font-weight: 700;
418
+ font-size: 13px;
419
+ margin-bottom: 8px;
420
+ margin-top: ${(props) => (props.marginTop ? '12px' : '0')};
421
+ `
422
+
423
+ const SectionContainer = styled.div``
424
+
425
+ const GridContainer = styled.div`
426
+ display: grid;
427
+ grid-template-columns: 1fr 1fr;
428
+ grid-gap: 12px;
429
+ `
430
+
431
+ const ViewContainerAttrs = { maxWidth: Number }
432
+ const ViewContainer = styled('div', ViewContainerAttrs)`
433
+ max-width: ${(props) =>
434
+ props.maxWidth && props.maxWidth > 300 ? props.maxWidth + 'ch' : '300px'};
435
+ `
436
+
437
+ const UpperContainer = styled.div`
438
+ display: grid;
439
+ grid-gap: 20px
440
+ grid-template-columns: 1fr 1fr;
441
+ padding: 10px 14px;
442
+ `
443
+
444
+ const ResetButton = styled.div`
445
+ display: inline-flex;
446
+ gap: 16px;
447
+ width: max-content;
448
+ margin-top: 20px;
449
+ align-self: center;
450
+ font-size: 13px;
451
+ color: ${(props) => props.theme.colors.blue};
452
+ cursor: pointer;
453
+ `
454
+
455
+ export default {
456
+ name: 'FilterSettings',
457
+ components: {
458
+ ContainerWrapper,
459
+ ColumnWrapper,
460
+ ColumnTitle,
461
+ ColumnContainer,
462
+ SelectComponent,
463
+ RowContainer,
464
+ OptionTitle,
465
+ Option,
466
+ ButtonContainer,
467
+ MainButton,
468
+ CheckboxContainer,
469
+ CheckboxWrapper,
470
+ Checkbox,
471
+ RowWrapper,
472
+ DropdownCheckboxContainer,
473
+ Draggable,
474
+ Icon,
475
+ DragContainer,
476
+ InputNumber,
477
+ RowLabel,
478
+ SectionContainer,
479
+ GridContainer,
480
+ ViewContainer,
481
+ DeleteIcon,
482
+ UpperContainer,
483
+ ResetButton,
484
+ ResetContainer,
485
+ VueDatePicker,
486
+ },
487
+ props: {
488
+ filterData: {
489
+ required: true,
490
+ },
491
+ hasActiveView: {
492
+ required: false,
493
+ },
494
+ buttonText: {
495
+ required: true,
496
+ // example:
497
+ // {
498
+ // 'save_new_view': '$gettext("save_new_view")',
499
+ // 'cancel': '$gettext("cancel")',
500
+ // 'save_view': '$gettext("save_view")'
501
+ // }
502
+ },
503
+ filterViews: {
504
+ required: true,
505
+ },
506
+ activeLanguage: {
507
+ required: false,
508
+ },
509
+ settingsTranslations: {
510
+ required: false,
511
+ },
512
+ activeView: {
513
+ required: false,
514
+ },
515
+ },
516
+ data() {
517
+ return {
518
+ selectedDates: null,
519
+ value1: null,
520
+ dateStart: null,
521
+ dateEnd: null,
522
+ }
523
+ },
524
+ computed: {
525
+ isCheckboxDisabled() {
526
+ // if only 1 item left, disable checkbox
527
+ let isDisabled = false
528
+ let columnsData = this.filterData.filter(
529
+ (item) => item.type === 'columns'
530
+ )
531
+ if (columnsData.length) {
532
+ columnsData = columnsData[0]
533
+ const filteredColumns = columnsData.dataOptions.filter(
534
+ (item) => item.selected
535
+ )
536
+ if (filteredColumns.length === 1) {
537
+ isDisabled = true
538
+ }
539
+ }
540
+ return isDisabled
541
+ },
542
+ theme() {
543
+ return theme
544
+ },
545
+ },
546
+ methods: {
547
+ onChange({ dataType, value, choice, field }) {
548
+ if (
549
+ dataType === 'columns' &&
550
+ this.isCheckboxDisabled &&
551
+ value === false
552
+ ) {
553
+ return
554
+ }
555
+ const data = { dataType, value, choice, field }
556
+ this.$emit('on-filter-change', data)
557
+ },
558
+ onDatepickerFocus(range) {
559
+ this.dateStart = range.start
560
+ this.dateEnd = range.end
561
+ this.$emit('on-prevent-close', true)
562
+ },
563
+ onDatepickerBlur() {
564
+ this.$emit('on-prevent-close', false)
565
+ },
566
+ disablePastDates(date) {
567
+ const dateString = this.dateStart
568
+ if (!dateString) {
569
+ return
570
+ }
571
+ const dateParts = dateString.split('-')
572
+
573
+ const year = parseInt(dateParts[0])
574
+ const month = parseInt(dateParts[1]) - 1 // Subtract 1 since January is month 0
575
+ const day = parseInt(dateParts[2])
576
+
577
+ const currentDate = new Date(year, month, day)
578
+ const selectedDate = new Date(date)
579
+
580
+ // Disable dates that are greater than or equal to the current date
581
+ return selectedDate <= currentDate
582
+ },
583
+ disableFutureDates(date) {
584
+ const dateString = this.dateEnd
585
+ if (!dateString) {
586
+ return
587
+ }
588
+ const dateParts = dateString.split('-')
589
+
590
+ const year = parseInt(dateParts[0])
591
+ const month = parseInt(dateParts[1]) - 1 // Subtract 1 since January is month 0
592
+ const day = parseInt(dateParts[2])
593
+
594
+ const currentDate = new Date(year, month, day)
595
+ const selectedDate = new Date(date)
596
+
597
+ // Disable dates that are greater than or equal to the current date
598
+ return selectedDate >= currentDate
599
+ },
600
+ getDatePickerLanguage() {
601
+ return datePickerLang(this.activeLanguage)
602
+ },
603
+ onDragChange({ data }) {
604
+ this.$emit('on-drag-change', data)
605
+ },
606
+ modifyDragItem(dataTransfer) {
607
+ const isSafari = /^((?!chrome|android).)*safari/i.test(
608
+ navigator.userAgent
609
+ )
610
+ // prevents the dragged element from dragging the whole row as a "ghost"
611
+ // Safari fix because this does not work on Safari
612
+ let img = new Image()
613
+ if (!isSafari) {
614
+ dataTransfer.setDragImage(img, 0, 0)
615
+ } else {
616
+ img.src =
617
+ 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
618
+ dataTransfer.setDragImage(img, 0, 0)
619
+ }
620
+ },
621
+ getSelectedValue({ value, options, filter }) {
622
+ const foundItem = options.find((item) => item.choice === value)
623
+ return foundItem ? foundItem.text : value ? value : filter.selectedText
624
+ },
625
+ isMultipleSelector(type) {
626
+ return type === 'multi_select_integer' || type === 'multi_select_string'
627
+ },
628
+ isRangeSelector(type) {
629
+ return type === 'integer_range' || type === 'number_range'
630
+ },
631
+ isIntegerRange(type) {
632
+ return type === 'integer_range'
633
+ },
634
+ isDateSelector(type) {
635
+ return type === 'datetime'
636
+ },
637
+ },
638
+ }
639
+ </script>