@eturnity/eturnity_reusable_components 7.32.1-qa-elisee-7.32.1 → 7.33.0-EPDM-11313.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 (324) 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/bullet_list.svg +8 -8
  58. package/src/assets/svgIcons/calendar.svg +7 -7
  59. package/src/assets/svgIcons/calendar_icon.svg +7 -7
  60. package/src/assets/svgIcons/call.svg +3 -3
  61. package/src/assets/svgIcons/camera.svg +3 -3
  62. package/src/assets/svgIcons/car.svg +3 -3
  63. package/src/assets/svgIcons/cart.svg +3 -3
  64. package/src/assets/svgIcons/charger_icon_white.svg +44 -44
  65. package/src/assets/svgIcons/checkbox.svg +3 -3
  66. package/src/assets/svgIcons/clear_formatting.svg +7 -7
  67. package/src/assets/svgIcons/clickable_info.svg +4 -4
  68. package/src/assets/svgIcons/clip.svg +3 -3
  69. package/src/assets/svgIcons/clock.svg +17 -17
  70. package/src/assets/svgIcons/clock_full.svg +3 -3
  71. package/src/assets/svgIcons/close_for_modals,_tool_tips.svg +4 -4
  72. package/src/assets/svgIcons/co_branding.svg +5 -5
  73. package/src/assets/svgIcons/collapse.svg +4 -4
  74. package/src/assets/svgIcons/collections.svg +3 -3
  75. package/src/assets/svgIcons/component_library.svg +7 -7
  76. package/src/assets/svgIcons/consumption_tariffs.svg +43 -43
  77. package/src/assets/svgIcons/context_menu-1.svg +6 -6
  78. package/src/assets/svgIcons/context_menu-2.svg +5 -5
  79. package/src/assets/svgIcons/context_menu.svg +5 -5
  80. package/src/assets/svgIcons/context_menu_tabs.svg +5 -5
  81. package/src/assets/svgIcons/cross.svg +4 -4
  82. package/src/assets/svgIcons/current_variant.svg +4 -4
  83. package/src/assets/svgIcons/dashboard.svg +3 -3
  84. package/src/assets/svgIcons/data_transfer.svg +3 -3
  85. package/src/assets/svgIcons/deadline.svg +4 -4
  86. package/src/assets/svgIcons/deal_flow.svg +5 -5
  87. package/src/assets/svgIcons/delete.svg +4 -4
  88. package/src/assets/svgIcons/delete_area_active.svg +16 -16
  89. package/src/assets/svgIcons/delete_area_inactive.svg +15 -15
  90. package/src/assets/svgIcons/direction_active-1.svg +12 -12
  91. package/src/assets/svgIcons/direction_active.svg +5 -5
  92. package/src/assets/svgIcons/direction_arrow.svg +4 -4
  93. package/src/assets/svgIcons/direction_inactive.svg +4 -4
  94. package/src/assets/svgIcons/dislike.svg +3 -3
  95. package/src/assets/svgIcons/distance_tool.svg +8 -8
  96. package/src/assets/svgIcons/distances_active.svg +9 -9
  97. package/src/assets/svgIcons/distances_inactive.svg +8 -8
  98. package/src/assets/svgIcons/distort_tool.svg +10 -10
  99. package/src/assets/svgIcons/distort_tool2.svg +16 -16
  100. package/src/assets/svgIcons/document.svg +3 -3
  101. package/src/assets/svgIcons/documents.svg +4 -4
  102. package/src/assets/svgIcons/downarrow.svg +3 -3
  103. package/src/assets/svgIcons/download.svg +4 -4
  104. package/src/assets/svgIcons/drag_icon.svg +8 -8
  105. package/src/assets/svgIcons/draggable_corner.svg +5 -5
  106. package/src/assets/svgIcons/draw_tool.svg +3 -3
  107. package/src/assets/svgIcons/duplicate-1.svg +8 -8
  108. package/src/assets/svgIcons/duplicate-2.svg +5 -5
  109. package/src/assets/svgIcons/duplicate.svg +4 -4
  110. package/src/assets/svgIcons/e-mobility_configurator.svg +6 -6
  111. package/src/assets/svgIcons/e_signature.svg +5 -5
  112. package/src/assets/svgIcons/edit_button.svg +3 -3
  113. package/src/assets/svgIcons/electricity_tariff.svg +3 -3
  114. package/src/assets/svgIcons/email.svg +3 -3
  115. package/src/assets/svgIcons/ems-1.svg +3 -3
  116. package/src/assets/svgIcons/ems.svg +3 -3
  117. package/src/assets/svgIcons/end_of_the_list.svg +5 -5
  118. package/src/assets/svgIcons/erase.svg +4 -4
  119. package/src/assets/svgIcons/external_icon.svg +5 -5
  120. package/src/assets/svgIcons/fav_icon.svg +4 -4
  121. package/src/assets/svgIcons/finance.svg +3 -3
  122. package/src/assets/svgIcons/financing_for_pv-1.svg +5 -5
  123. package/src/assets/svgIcons/financing_for_pv-2.svg +3 -3
  124. package/src/assets/svgIcons/financing_for_pv.svg +6 -6
  125. package/src/assets/svgIcons/finish-1.svg +4 -4
  126. package/src/assets/svgIcons/finish.svg +3 -3
  127. package/src/assets/svgIcons/flatten.svg +11 -11
  128. package/src/assets/svgIcons/flatten_roof.svg +20 -20
  129. package/src/assets/svgIcons/folder.svg +3 -3
  130. package/src/assets/svgIcons/free_technology.svg +5 -5
  131. package/src/assets/svgIcons/handle.svg +5 -5
  132. package/src/assets/svgIcons/heat_calc.svg +7 -7
  133. package/src/assets/svgIcons/height_equalize.svg +3 -3
  134. package/src/assets/svgIcons/height_snap.svg +3 -3
  135. package/src/assets/svgIcons/house.svg +3 -3
  136. package/src/assets/svgIcons/house_3d-1.svg +7 -7
  137. package/src/assets/svgIcons/house_3d.svg +7 -7
  138. package/src/assets/svgIcons/inclination.svg +2 -2
  139. package/src/assets/svgIcons/info.svg +3 -3
  140. package/src/assets/svgIcons/initial_situation.svg +3 -3
  141. package/src/assets/svgIcons/integrations.svg +3 -3
  142. package/src/assets/svgIcons/intro-tour-1.svg +3 -3
  143. package/src/assets/svgIcons/intro-tour.svg +3 -3
  144. package/src/assets/svgIcons/inverter-1.svg +5 -5
  145. package/src/assets/svgIcons/inverter.svg +3 -3
  146. package/src/assets/svgIcons/italic.svg +3 -3
  147. package/src/assets/svgIcons/key.svg +3 -3
  148. package/src/assets/svgIcons/layers_close.svg +4 -4
  149. package/src/assets/svgIcons/layers_open.svg +4 -4
  150. package/src/assets/svgIcons/lead_marketplace.svg +6 -6
  151. package/src/assets/svgIcons/lead_provider.svg +4 -4
  152. package/src/assets/svgIcons/length_2d.svg +2 -2
  153. package/src/assets/svgIcons/length_3d.svg +4 -4
  154. package/src/assets/svgIcons/length_calculator.svg +2 -2
  155. package/src/assets/svgIcons/length_in_2d_active.svg +12 -12
  156. package/src/assets/svgIcons/length_in_2d_inctive.svg +13 -13
  157. package/src/assets/svgIcons/light_bulb.svg +3 -3
  158. package/src/assets/svgIcons/like.svg +3 -3
  159. package/src/assets/svgIcons/line_graph.svg +3 -3
  160. package/src/assets/svgIcons/local_subsidies.svg +18 -18
  161. package/src/assets/svgIcons/location.svg +3 -3
  162. package/src/assets/svgIcons/lock.svg +3 -3
  163. package/src/assets/svgIcons/logout.svg +3 -3
  164. package/src/assets/svgIcons/loop.svg +3 -3
  165. package/src/assets/svgIcons/lunch.svg +4 -4
  166. package/src/assets/svgIcons/magic_tool.svg +6 -6
  167. package/src/assets/svgIcons/map_icon.svg +5 -5
  168. package/src/assets/svgIcons/map_settings.svg +3 -3
  169. package/src/assets/svgIcons/margin_tool.svg +4 -4
  170. package/src/assets/svgIcons/meeting.svg +6 -6
  171. package/src/assets/svgIcons/move_copy.svg +4 -4
  172. package/src/assets/svgIcons/new_area_inactive.svg +11 -11
  173. package/src/assets/svgIcons/next.svg +4 -4
  174. package/src/assets/svgIcons/not_equal_to.svg +3 -3
  175. package/src/assets/svgIcons/numbered_list.svg +6 -6
  176. package/src/assets/svgIcons/obstacle_tool.svg +9 -9
  177. package/src/assets/svgIcons/obstacle_tool_origin.svg +3 -3
  178. package/src/assets/svgIcons/offset_tool.svg +8 -8
  179. package/src/assets/svgIcons/outline_tool.svg +11 -11
  180. package/src/assets/svgIcons/pan_tool.svg +12 -12
  181. package/src/assets/svgIcons/panels_tool.svg +8 -8
  182. package/src/assets/svgIcons/pen_tool.svg +4 -4
  183. package/src/assets/svgIcons/picker_tool.svg +4 -4
  184. package/src/assets/svgIcons/picture.svg +3 -3
  185. package/src/assets/svgIcons/pin.svg +5 -5
  186. package/src/assets/svgIcons/presentation.svg +3 -3
  187. package/src/assets/svgIcons/previous.svg +4 -4
  188. package/src/assets/svgIcons/profile-1.svg +4 -4
  189. package/src/assets/svgIcons/profile.svg +4 -4
  190. package/src/assets/svgIcons/profitability.svg +3 -3
  191. package/src/assets/svgIcons/project_analysis.svg +4 -4
  192. package/src/assets/svgIcons/project_settings.svg +4 -4
  193. package/src/assets/svgIcons/pv.svg +3 -3
  194. package/src/assets/svgIcons/quotations.svg +6 -6
  195. package/src/assets/svgIcons/redo.svg +6 -6
  196. package/src/assets/svgIcons/resizer.svg +5 -5
  197. package/src/assets/svgIcons/roof_layer.svg +3 -3
  198. package/src/assets/svgIcons/rotate_tool.svg +3 -3
  199. package/src/assets/svgIcons/rotate_view.svg +5 -5
  200. package/src/assets/svgIcons/ruler_tool.svg +3 -3
  201. package/src/assets/svgIcons/run_simulation.svg +3 -3
  202. package/src/assets/svgIcons/save.svg +3 -3
  203. package/src/assets/svgIcons/scaling_tool.svg +8 -8
  204. package/src/assets/svgIcons/search.svg +3 -3
  205. package/src/assets/svgIcons/security.svg +3 -3
  206. package/src/assets/svgIcons/settings.svg +3 -3
  207. package/src/assets/svgIcons/show_in_a_new_tab.svg +12 -12
  208. package/src/assets/svgIcons/smartphone.svg +4 -4
  209. package/src/assets/svgIcons/solar_calc.svg +13 -13
  210. package/src/assets/svgIcons/sorting.svg +4 -4
  211. package/src/assets/svgIcons/split.svg +12 -12
  212. package/src/assets/svgIcons/start_of_the_list.svg +5 -5
  213. package/src/assets/svgIcons/strikethrough.svg +4 -4
  214. package/src/assets/svgIcons/subscriptions.svg +3 -3
  215. package/src/assets/svgIcons/subsidies-1.svg +5 -5
  216. package/src/assets/svgIcons/subsidies-2.svg +3 -3
  217. package/src/assets/svgIcons/subsidies.svg +3 -3
  218. package/src/assets/svgIcons/subtract_icon.svg +3 -3
  219. package/src/assets/svgIcons/suitcase.svg +3 -3
  220. package/src/assets/svgIcons/summer.svg +3 -3
  221. package/src/assets/svgIcons/template_icon_not_clickable.svg +6 -6
  222. package/src/assets/svgIcons/transfer.svg +4 -4
  223. package/src/assets/svgIcons/trim_tool.svg +4 -4
  224. package/src/assets/svgIcons/truck.svg +3 -3
  225. package/src/assets/svgIcons/underlined.svg +3 -3
  226. package/src/assets/svgIcons/undo.svg +6 -6
  227. package/src/assets/svgIcons/uparrow.svg +3 -3
  228. package/src/assets/svgIcons/update.svg +3 -3
  229. package/src/assets/svgIcons/upload_avatar-1.svg +12 -12
  230. package/src/assets/svgIcons/upload_avatar.svg +5 -5
  231. package/src/assets/svgIcons/upload_image.svg +8 -8
  232. package/src/assets/svgIcons/upload_image_tool.svg +7 -7
  233. package/src/assets/svgIcons/variants.svg +6 -6
  234. package/src/assets/svgIcons/vertical_tool.svg +3 -3
  235. package/src/assets/svgIcons/virtual_storage.svg +4 -4
  236. package/src/assets/svgIcons/warning.svg +4 -4
  237. package/src/assets/svgIcons/way.svg +5 -5
  238. package/src/assets/svgIcons/wifi.svg +3 -3
  239. package/src/assets/svgIcons/winter.svg +3 -3
  240. package/src/assets/svgIcons/workflow_template.svg +11 -11
  241. package/src/assets/theme.js +41 -41
  242. package/src/components/addNewButton/AddNewButton.stories.js +24 -24
  243. package/src/components/addNewButton/index.vue +61 -61
  244. package/src/components/banner/actionBanner/index.vue +64 -64
  245. package/src/components/banner/banner/banner.stories.js +31 -31
  246. package/src/components/banner/banner/index.vue +188 -188
  247. package/src/components/banner/infoBanner/index.vue +57 -57
  248. package/src/components/buttons/buttonIcon/index.vue +145 -145
  249. package/src/components/buttons/closeButton/CloseButton.stories.js +29 -29
  250. package/src/components/buttons/closeButton/index.vue +61 -61
  251. package/src/components/buttons/mainButton/index.vue +144 -140
  252. package/src/components/card/index.vue +96 -96
  253. package/src/components/collapsableInfoText/index.vue +127 -127
  254. package/src/components/deleteIcon/DeleteIcon.stories.js +29 -29
  255. package/src/components/deleteIcon/index.vue +78 -78
  256. package/src/components/draggableInputHandle/index.vue +46 -46
  257. package/src/components/dropdown/Dropdown.stories.js +53 -53
  258. package/src/components/dropdown/index.vue +138 -138
  259. package/src/components/errorMessage/index.vue +64 -64
  260. package/src/components/filter/filterSettings.vue +639 -639
  261. package/src/components/filter/index.vue +154 -154
  262. package/src/components/filter/parentDropdown.vue +91 -91
  263. package/src/components/icon/Icons.stories.js +41 -41
  264. package/src/components/icon/iconCache.js +23 -23
  265. package/src/components/icon/iconCollection.vue +68 -68
  266. package/src/components/icon/index.vue +140 -140
  267. package/src/components/iconWrapper/index.vue +179 -179
  268. package/src/components/infoCard/index.vue +40 -40
  269. package/src/components/infoText/index.vue +170 -170
  270. package/src/components/inputs/checkbox/Checkbox.stories.js +57 -57
  271. package/src/components/inputs/checkbox/index.vue +224 -224
  272. package/src/components/inputs/inputNumber/InputNumber.stories.js +150 -150
  273. package/src/components/inputs/inputNumber/index.vue +789 -784
  274. package/src/components/inputs/inputNumberQuestion/index.vue +218 -218
  275. package/src/components/inputs/inputText/InputText.stories.js +75 -75
  276. package/src/components/inputs/inputText/index.vue +376 -376
  277. package/src/components/inputs/radioButton/RadioButton.stories.js +58 -58
  278. package/src/components/inputs/radioButton/index.vue +273 -273
  279. package/src/components/inputs/searchInput/SearchInput.stories.js +40 -40
  280. package/src/components/inputs/searchInput/index.vue +151 -151
  281. package/src/components/inputs/select/index.vue +908 -907
  282. package/src/components/inputs/select/option/index.vue +148 -148
  283. package/src/components/inputs/select/select.stories.js +58 -58
  284. package/src/components/inputs/slider/index.vue +126 -126
  285. package/src/components/inputs/switchField/index.vue +254 -254
  286. package/src/components/inputs/textAreaInput/TextAreaInput.stories.js +127 -127
  287. package/src/components/inputs/textAreaInput/index.vue +198 -198
  288. package/src/components/inputs/toggle/Toggle.stories.js +77 -77
  289. package/src/components/inputs/toggle/index.vue +285 -285
  290. package/src/components/label/index.vue +99 -99
  291. package/src/components/markerItem/index.vue +88 -88
  292. package/src/components/modals/actionModal/index.vue +64 -64
  293. package/src/components/modals/infoModal/index.vue +52 -52
  294. package/src/components/modals/modal/index.vue +188 -188
  295. package/src/components/modals/modal/modal.stories.js +31 -31
  296. package/src/components/navigationTabs/index.vue +114 -114
  297. package/src/components/pageSubtitle/index.vue +67 -67
  298. package/src/components/pageTitle/index.vue +68 -68
  299. package/src/components/pagination/index.vue +148 -148
  300. package/src/components/progressBar/index.vue +125 -125
  301. package/src/components/projectMarker/index.vue +300 -300
  302. package/src/components/rangeSlider/Slider.vue +573 -573
  303. package/src/components/rangeSlider/index.vue +517 -517
  304. package/src/components/rangeSlider/utils/dom.js +49 -49
  305. package/src/components/rangeSlider/utils/fns.js +26 -26
  306. package/src/components/selectedOptions/index.vue +145 -145
  307. package/src/components/sideMenu/index.vue +270 -270
  308. package/src/components/spinner/index.vue +68 -68
  309. package/src/components/tableDropdown/index.vue +638 -638
  310. package/src/components/tables/mainTable/exampleNested.vue +328 -328
  311. package/src/components/tables/mainTable/index.vue +510 -510
  312. package/src/components/tables/viewTable/index.vue +195 -195
  313. package/src/components/tabsHeader/index.vue +83 -83
  314. package/src/components/threeDots/index.vue +413 -413
  315. package/src/components/videoThumbnail/index.vue +103 -103
  316. package/src/components/videoThumbnail/videoThumbnail.stories.js +33 -33
  317. package/src/helpers/currencyMapping.js +28 -28
  318. package/src/helpers/numberConverter.js +103 -103
  319. package/src/helpers/translateLang.js +128 -128
  320. package/src/main.js +6 -6
  321. package/src/mixins/inputValidations.js +97 -97
  322. package/src/utils/index.js +12 -0
  323. package/src/assets/svgIcons/adjust_roof.svg +0 -6
  324. package/src/assets/svgIcons/copy.svg +0 -10
@@ -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>