@eturnity/eturnity_reusable_components 7.24.3-EPDM-11320.0 → 7.24.3-EPDM-8441.0

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