@eturnity/eturnity_reusable_components 7.12.6-EPDM-7951.3 → 7.12.7

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