|
1 | 1 | (function (global, doc, ibexa, flatpickr, React, ReactDOM) {
|
2 | 2 | const { escapeHTML, escapeHTMLAttribute } = ibexa.helpers.text;
|
3 | 3 | const { dangerouslySetInnerHTML } = ibexa.helpers.dom;
|
| 4 | + const { getInstance } = ibexa.helpers.objectInstances; |
4 | 5 | let getUsersTimeout;
|
5 |
| - const CLASS_DATE_RANGE = 'ibexa-filters__range-wrapper'; |
6 |
| - const CLASS_VISIBLE_DATE_RANGE = 'ibexa-filters__range-wrapper--visible'; |
7 | 6 | const SELECTOR_TAG = '.ibexa-tag';
|
8 | 7 | const token = doc.querySelector('meta[name="CSRF-Token"]').content;
|
9 | 8 | const siteaccess = doc.querySelector('meta[name="SiteAccess"]').content;
|
10 | 9 | const filters = doc.querySelector('.ibexa-filters');
|
11 | 10 | const clearBtn = filters.querySelector('.ibexa-btn--clear');
|
12 | 11 | const applyBtn = filters.querySelector('.ibexa-btn--apply');
|
13 |
| - const dateFields = doc.querySelectorAll('.ibexa-filters__range-wrapper'); |
14 | 12 | const contentTypeSelect = doc.querySelector('.ibexa-filters__item--content-type .ibexa-filters__select');
|
15 | 13 | const sectionSelect = doc.querySelector('.ibexa-filters__item--section .ibexa-filters__select');
|
16 |
| - const lastModifiedSelect = doc.querySelector('.ibexa-filters__item--modified .ibexa-filters__select'); |
17 |
| - const lastModifiedDateRange = doc.querySelector('.ibexa-filters__item--modified .ibexa-filters__range-select'); |
18 |
| - const lastCreatedSelect = doc.querySelector('.ibexa-filters__item--created .ibexa-filters__select'); |
19 |
| - const lastCreatedDateRange = doc.querySelector('.ibexa-filters__item--created .ibexa-filters__range-select'); |
| 14 | + const lastModifiedSelectNode = doc.querySelector('.ibexa-filters__item--modified .ibexa-filters__select'); |
| 15 | + const lastModifiedSelect = getInstance(lastModifiedSelectNode); |
| 16 | + const lastModifiedDateRangeNode = doc.querySelector('.ibexa-filters__item--modified .ibexa-date-time-range-single'); |
| 17 | + const lastModifiedDateRange = getInstance(lastModifiedDateRangeNode); |
| 18 | + const lastCreatedSelectNode = doc.querySelector('.ibexa-filters__item--created .ibexa-filters__select'); |
| 19 | + const lastCreatedSelect = getInstance(lastCreatedSelectNode); |
| 20 | + const lastCreatedDateRangeNode = doc.querySelector('.ibexa-filters__item--created .ibexa-date-time-range-single'); |
| 21 | + const lastCreatedDateRange = getInstance(lastCreatedDateRangeNode); |
20 | 22 | const creatorInput = doc.querySelector('.ibexa-filters__item--creator .ibexa-input');
|
21 | 23 | const searchCreatorInput = doc.querySelector('#search_creator');
|
22 | 24 | const usersList = doc.querySelector('.ibexa-filters__item--creator .ibexa-filters__user-list');
|
23 | 25 | const contentTypeCheckboxes = doc.querySelectorAll('.ibexa-content-type-selector__item [type="checkbox"]');
|
24 | 26 | const selectSubtreeBtn = doc.querySelector('.ibexa-filters__item--subtree .ibexa-tag-view-select__btn-select-path');
|
25 | 27 | const subtreeInput = doc.querySelector('#search_subtree');
|
26 | 28 | const showMoreBtns = doc.querySelectorAll('.ibexa-content-type-selector__show-more');
|
27 |
| - const dateConfig = { |
28 |
| - mode: 'range', |
29 |
| - locale: { |
30 |
| - rangeSeparator: ' - ', |
31 |
| - }, |
32 |
| - formatDate: (date) => ibexa.helpers.timezone.formatShortDateTime(date, null, ibexa.adminUiConfig.dateFormat.shortDate), |
33 |
| - }; |
34 | 29 | const clearFilters = (event) => {
|
35 | 30 | event.preventDefault();
|
36 | 31 |
|
37 | 32 | const option = contentTypeSelect.querySelector('option');
|
38 | 33 | const defaultText = option.dataset.default;
|
39 |
| - const lastModifiedDataRange = doc.querySelector(lastModifiedSelect.dataset.targetSelector); |
40 |
| - const lastCreatedDataRange = doc.querySelector(lastCreatedSelect.dataset.targetSelector); |
| 34 | + const lastModifiedDataRange = doc.querySelector(lastModifiedSelectNode.dataset.targetSelector); |
| 35 | + const lastCreatedDataRange = doc.querySelector(lastCreatedSelectNode.dataset.targetSelector); |
41 | 36 | const lastModifiedPeriod = doc.querySelector(lastModifiedDataRange.dataset.periodSelector);
|
42 | 37 | const lastModifiedEnd = doc.querySelector(lastModifiedDataRange.dataset.endSelector);
|
43 | 38 | const lastCreatedPeriod = doc.querySelector(lastCreatedDataRange.dataset.periodSelector);
|
|
53 | 48 | sectionSelect[0].selected = true;
|
54 | 49 | }
|
55 | 50 |
|
56 |
| - lastModifiedSelect[0].selected = true; |
57 |
| - lastCreatedSelect[0].selected = true; |
58 |
| - lastModifiedSelect.querySelector('option').selected = true; |
| 51 | + lastModifiedSelectNode[0].selected = true; |
| 52 | + lastCreatedSelectNode[0].selected = true; |
| 53 | + lastModifiedSelectNode.querySelector('option').selected = true; |
59 | 54 | lastModifiedPeriod.value = '';
|
60 | 55 | lastModifiedEnd.value = '';
|
61 | 56 | lastCreatedPeriod.value = '';
|
|
72 | 67 | const isSectionSelected = sectionSelect ? !!sectionSelect.value : false;
|
73 | 68 | const isCreatorSelected = !!searchCreatorInput.value;
|
74 | 69 | const isSubtreeSelected = !!subtreeInput.value.trim().length;
|
75 |
| - let isModifiedSelected = !!lastModifiedSelect.value; |
76 |
| - let isCreatedSelected = !!lastCreatedSelect.value; |
| 70 | + let isModifiedSelected = !!lastModifiedSelectNode.value; |
| 71 | + let isCreatedSelected = !!lastCreatedSelectNode.value; |
77 | 72 |
|
78 |
| - if (lastModifiedSelect.value === 'custom_range') { |
79 |
| - const lastModifiedWrapper = lastModifiedDateRange.closest(`.${CLASS_DATE_RANGE}`); |
80 |
| - const { periodSelector, endSelector } = lastModifiedWrapper.dataset; |
| 73 | + if (lastModifiedSelectNode.value === 'custom_range') { |
| 74 | + const { periodSelector, endSelector } = lastModifiedDateRangeNode.dataset; |
81 | 75 | const lastModifiedPeriodValue = doc.querySelector(periodSelector).value;
|
82 | 76 | const lastModifiedEndDate = doc.querySelector(endSelector).value;
|
83 | 77 |
|
|
86 | 80 | }
|
87 | 81 | }
|
88 | 82 |
|
89 |
| - if (lastCreatedSelect.value === 'custom_range') { |
90 |
| - const lastCreatedWrapper = lastCreatedDateRange.closest(`.${CLASS_DATE_RANGE}`); |
91 |
| - const { periodSelector, endSelector } = lastCreatedWrapper.dataset; |
| 83 | + if (lastCreatedSelectNode.value === 'custom_range') { |
| 84 | + const { periodSelector, endSelector } = lastCreatedDateRangeNode.dataset; |
92 | 85 | const lastCreatedPeriodValue = doc.querySelector(periodSelector).value;
|
93 | 86 | const lastCreatedEndDate = doc.querySelector(endSelector).value;
|
94 | 87 |
|
|
103 | 96 |
|
104 | 97 | applyBtn[methodName]('disabled', !isEnabled);
|
105 | 98 | };
|
106 |
| - const toggleDatesSelectVisibility = (event) => { |
107 |
| - const datesRangeNode = doc.querySelector(event.target.dataset.targetSelector); |
108 |
| - |
109 |
| - if (event.target.value !== 'custom_range') { |
110 |
| - doc.querySelector(datesRangeNode.dataset.periodSelector).value = event.target.value; |
111 |
| - doc.querySelector(datesRangeNode.dataset.endSelector).value = ''; |
112 |
| - datesRangeNode.classList.remove(CLASS_VISIBLE_DATE_RANGE); |
| 99 | + const toggleDatesSelectVisibility = (select, dateRange) => { |
| 100 | + if (select.value !== 'custom_range') { |
| 101 | + dateRange.setDates([]); |
| 102 | + dateRange.toggleHidden(true); |
113 | 103 |
|
114 | 104 | toggleDisabledStateOnApplyBtn();
|
115 | 105 |
|
116 | 106 | return;
|
117 | 107 | }
|
118 | 108 |
|
119 |
| - datesRangeNode.classList.add(CLASS_VISIBLE_DATE_RANGE); |
| 109 | + dateRange.toggleHidden(false); |
120 | 110 | };
|
121 | 111 | const filterByContentType = () => {
|
122 | 112 | const selectedCheckboxes = [...contentTypeCheckboxes].filter((checkbox) => checkbox.checked);
|
|
128 | 118 |
|
129 | 119 | toggleDisabledStateOnApplyBtn();
|
130 | 120 | };
|
131 |
| - const setSelectedDateRange = (timestamps, { dates, inputField }) => { |
132 |
| - const dateRange = inputField.closest('.ibexa-filters__range-wrapper'); |
133 |
| - |
134 |
| - if (dates.length === 2) { |
135 |
| - const startDate = getUnixTimestampUTC(dates[0]); |
136 |
| - const endDate = getUnixTimestampUTC(dates[1]); |
137 |
| - const secondsInDay = 86400; |
138 |
| - const days = (endDate - startDate) / secondsInDay; |
139 |
| - |
140 |
| - doc.querySelector(dateRange.dataset.periodSelector).value = `P0Y0M${days}D`; |
141 |
| - doc.querySelector(dateRange.dataset.endSelector).value = endDate; |
142 |
| - } else if (dates.length === 0) { |
143 |
| - doc.querySelector(dateRange.dataset.periodSelector).value = ''; |
144 |
| - doc.querySelector(dateRange.dataset.endSelector).value = ''; |
145 |
| - } |
146 |
| - |
147 |
| - toggleDisabledStateOnApplyBtn(); |
148 |
| - }; |
149 |
| - const getUnixTimestampUTC = (dateObject) => { |
150 |
| - let date = new Date(Date.UTC(dateObject.getFullYear(), dateObject.getMonth(), dateObject.getDate())); |
151 |
| - |
152 |
| - date = Math.floor(date.getTime() / 1000); |
153 |
| - |
154 |
| - return date; |
155 |
| - }; |
156 | 121 | const getUsersList = (value) => {
|
157 | 122 | const body = JSON.stringify({
|
158 | 123 | ViewInput: {
|
|
244 | 209 | usersList.classList.add('ibexa-filters__user-list--hidden');
|
245 | 210 | doc.querySelector('body').removeEventListener('click', handleClickOutsideUserList, false);
|
246 | 211 | };
|
247 |
| - const initFlatPickr = (dateRangeField) => { |
248 |
| - const { start, end } = dateRangeField.querySelector('.ibexa-filters__range-select').dataset; |
249 |
| - const defaultDate = start && end ? [start, end] : []; |
250 |
| - |
251 |
| - const dateTimePickerWidget = new ibexa.core.DateTimePicker({ |
252 |
| - container: dateRangeField, |
253 |
| - onChange: setSelectedDateRange, |
254 |
| - flatpickrConfig: { |
255 |
| - ...dateConfig, |
256 |
| - defaultDate, |
257 |
| - }, |
258 |
| - }); |
259 |
| - |
260 |
| - dateTimePickerWidget.init(); |
261 |
| - }; |
262 | 212 | const removeSearchTag = (event) => {
|
263 | 213 | const tag = event.currentTarget.closest(SELECTOR_TAG);
|
264 | 214 | const form = event.currentTarget.closest('form');
|
|
281 | 231 | subtreeInput.value = '';
|
282 | 232 | removeSearchTag(event);
|
283 | 233 | };
|
284 |
| - const clearDataRange = (event, selector) => { |
285 |
| - const dataRange = doc.querySelector(selector); |
286 |
| - const rangeSelect = dataRange.parentNode.querySelector('.ibexa-filters__select'); |
287 |
| - const periodInput = doc.querySelector(dataRange.dataset.periodSelector); |
288 |
| - const endDateInput = doc.querySelector(dataRange.dataset.endSelector); |
289 |
| - |
290 |
| - rangeSelect[0].selected = true; |
291 |
| - periodInput.value = ''; |
292 |
| - endDateInput.vaue = ''; |
293 |
| - dataRange.classList.remove(CLASS_VISIBLE_DATE_RANGE); |
| 234 | + const clearDataRange = (event, select, dateRange) => { |
| 235 | + select.clearCurrentSelection(); |
| 236 | + dateRange.setDates([]); |
| 237 | + dateRange.toggleHidden(true); |
294 | 238 | removeSearchTag(event);
|
295 | 239 | };
|
296 | 240 | const clearCreator = (event) => {
|
|
302 | 246 | subtree: (event) => clearSubtree(event),
|
303 | 247 | creator: (event) => clearCreator(event),
|
304 | 248 | 'content-types': (event) => clearContentType(event),
|
305 |
| - 'last-modified': (event) => clearDataRange(event, lastModifiedSelect.dataset.targetSelector), |
306 |
| - 'last-created': (event) => clearDataRange(event, lastCreatedSelect.dataset.targetSelector), |
| 249 | + 'last-modified': (event) => clearDataRange(event, lastModifiedSelect, lastModifiedDateRange), |
| 250 | + 'last-created': (event) => clearDataRange(event, lastCreatedSelect, lastCreatedDateRange), |
307 | 251 | };
|
308 | 252 | const showMoreContentTypes = (event) => {
|
309 | 253 | const btn = event.currentTarget;
|
|
347 | 291 | );
|
348 | 292 | };
|
349 | 293 |
|
350 |
| - dateFields.forEach(initFlatPickr); |
351 | 294 | filterByContentType();
|
352 | 295 |
|
353 | 296 | clearBtn.addEventListener('click', clearFilters, false);
|
|
363 | 306 | }
|
364 | 307 |
|
365 | 308 | subtreeInput.addEventListener('change', toggleDisabledStateOnApplyBtn, false);
|
366 |
| - lastModifiedSelect.addEventListener('change', toggleDatesSelectVisibility, false); |
367 |
| - lastCreatedSelect.addEventListener('change', toggleDatesSelectVisibility, false); |
| 309 | + lastModifiedSelectNode.addEventListener( |
| 310 | + 'change', |
| 311 | + () => toggleDatesSelectVisibility(lastModifiedSelectNode, lastModifiedDateRange), |
| 312 | + false, |
| 313 | + ); |
| 314 | + lastCreatedSelectNode.addEventListener('change', () => toggleDatesSelectVisibility(lastCreatedSelectNode, lastCreatedDateRange), false); |
368 | 315 | creatorInput.addEventListener('keyup', handleTyping, false);
|
369 | 316 | usersList.addEventListener('click', handleSelectUser, false);
|
370 | 317 | contentTypeCheckboxes.forEach((checkbox) => checkbox.addEventListener('change', filterByContentType, false));
|
|
0 commit comments