PageSourceSearch

https://sgu.ru/sites/default/files/js/js_Mz-f0zBqpRs51myLrguerb3ORK-XvAlFlWZt0R6rN3s.js

js sgu.ru collected 2026-10-02 03:08:05 UTC 13,335 bytes, 313 lines download raw bytes

1const initCalendar = (elem) => new AirDatepicker(elem, {
2  range: true, // разрешить выделять диапазон
3  multipleDatesSeparator: ' - ', // разделитель дат в диапазоне 
4  keyboardNav: true, // навигация с клавитатуры: разрешить
5  onSelect({ date, formattedDate, datepicker }) { // на onSelect нужно стриггерить input событие при выделении даты
6    const triggerEvent = (el, eventType, detail) =>
7      el.dispatchEvent(new Event(eventType)); // создаем и отправляем событие 
8    triggerEvent(datepicker.$el, 'input'); // триггерим созданный эвент на календаре
9  },
10  
11  //inline: true,
12
13
14});
15
16
17const airDatepickers = document.querySelectorAll('.news-collection__air-datepicker');
18
19if( airDatepickers.length > 0 ){
20    airDatepickers.forEach((airDatepicker, index) => {
21        airDatepicker.classList.add(`air-datepicker${index+1}`);
22        initCalendar(`.air-datepicker${index+1}`);
23    }); 
24}
25
26
27// const calendar = initCalendar('.news-calendar');
28// const calendar2 = initCalendar('.news-calendar2');
29
30let dates = [] // создаем переменную для хранения информации о датах
31const date_min = document.querySelector('input[name="field_publ_date_value[min]"]')
32const date_max = document.querySelector('input[name="field_publ_date_value[max]"]')
33
34
35
36
37/**
38 * filterDates сравнивает дату публикации с диапазоном, заданным в условии
39 * Возвращает отфильтрованный массив
40 * @param {publ_date} - Дата публикации
41 * @param {dates} - Диапазон из условия
42 */
43function filterDates(publ_date, dates) {
44  const createDate = (string) => new Date(+string.split('.')[2], +string.split('.')[1] - 1, +string.split('.')[0])
45  const date = createDate(publ_date)
46  if (dates.includes('-')) { // если диапазолн дат
47    let date_min = createDate(dates.split(' ')[0]), date_max = createDate(dates.split(' ')[2])
48    return date > date_min && date < date_max
49  }
50  else { // усли одна дата
51    return publ_date == dates
52  }
53}
54
55/**
56 * filterSelectCategory сравнивает текстовые поля с условием
57 * Возвращает отфильтрованный массив
58 * @param {targetHeading} - Текст новости
59 * @param {targetKeywords} - Заголовок
60 * @param {word} - строка для поиска
61 */
62function filterSelectCategory(targetHeading, targetKeywords, word) {
63  return targetHeading.search(word) != -1 || targetKeywords.search(word) != -1
64}
65
66
67/**
68 * filterTextFields сравнивает текстовые поля с условием
69 * Возвращает отфильтрованный массив
70 * @param {targetText} - Текст новости
71 * @param {targetTitle} - Заголовок
72 * @param {string} - строка для поиска
73 */
74function filterTextFields(targetText, targetTitle, string) {
75  return targetTitle.search(string) != -1 || targetText.search(string) != -1
76}
77
78
79/**
80 * filterBy принимает условия поиска и массив, по которому нужно произвести фильтрацию
81 * Возвращает отфильтрованный массив
82 * @param {data} - Оригинальный массив
83 * @param {cond} - Условия поиска в виде объекта
84 */
85function filterBy(data, cond) {
86  
87  if (cond.dates == '' && cond.string == '' && cond.category == '') {
88    return data
89  }
90  return data.filter((row) => filterDates(row.field_publ_date.replace(/  |\r\n|\n|\r/gm, ''), cond.dates)
91    && filterTextFields(row.field_news_paragraphs.replace(/  |\r\n|\n|\t|\r/gm, '').toLowerCase(),
92      row.title.replace(/  |\r\n|\n|\r/gm, '').toLowerCase(), cond.string) && filterTextFields(row.field_heading, row.field_news_keywords, cond.category));
93}
94
95
96/**
97 * pullArrayMedia создает nodeobjecs для массива медиа
98 *  Возвращает node object'ы в массиве
99 * @param {sliderItems} - Массив ссылок на медиа
100 */
101function pullArrayMedia(mediaArray) {
102  let sliderItems = []
103  for (let i = 0; i <= mediaArray.length - 1; i++) {
104    let img = document.createElement("img"), slide = document.createElement("div");
105    img.setAttribute('class', 'news-header__image')
106    img.setAttribute('src', 'http://10.0.2.17:8882/sites/default/files/styles/large/public/node/news/header/' + mediaArray[i])
107    slide.setAttribute('class', 'swiper-slide')
108    slide.appendChild(img)
109    sliderItems.append(slide)
110  }
111  return sliderItems
112}
113
114/**
115 * createMarkup создает разметку для новости
116 *  Возвращает node object
117 * @param {item} - Отфильтрованный массив новостей
118 */
119function createMarkup(item) {
120  const gridItem = document.createElement("div"), images = document.createElement("div"),
121    slider = document.createElement("div"), announce = document.createElement("div"),
122    announce_top = document.createElement("div"), date = document.createElement("div"),
123    title = document.createElement("div"), text = document.createElement("div"),
124    sliderWrapper = document.createElement("div"), img = document.createElement("img"),
125    tags = document.createElement("div");
126  gridItem.setAttribute("class", 'news-feed__grid-item')
127  images.setAttribute("class", 'news-feed__image')
128  announce.setAttribute("class", 'news-feed__announce')
129  announce_top.setAttribute("class", 'news-feed__announce-top')
130  slider.setAttribute('class', 'news-header__slider')
131  slider.classList.add('swiper')
132  img.setAttribute('class', 'news-header__image')
133  sliderWrapper.setAttribute('class', 'swiper-wrapper')
134  date.setAttribute("class", 'news-feed__date')
135  title.setAttribute("class", 'news-feed__title')
136  text.setAttribute("class", 'news-feed__announce-text')
137  tags.setAttribute('class', 'news-feed__tags')
138  date.textContent = item.field_publ_date ? item.field_publ_date + ' / ' + item.field_publ_date : ''
139  title.textContent = item.title ? item.title : ''
140  text.textContent = item.field_news_paragraphs.substring(0, 700) ? item.field_news_paragraphs.substring(0, 700) : ''
141  tags.textContent = item.field_heading
142  let sliderItems = []
143  if (item.field_news_header_slider.split(',').length > 1) {
144     sliderItems = pullArrayMedia(item.field_news_header_slider.split(','))
145  }
146  else {
147    img.setAttribute('src', 'http://10.0.2.17:8882/sites/default/files/styles/large/public/node/news/header/' + item.field_news_header_slider)
148    sliderItems = img
149  }
150  sliderWrapper.append(sliderItems)
151  announce_top.append(date, tags)
152  announce.append(announce_top, title, text)
153  gridItem.appendChild(images)
154  gridItem.appendChild(announce)
155  slider.appendChild(sliderWrapper)
156  images.appendChild(slider)
157  return gridItem
158}
159
160/**
161 * showItems принимает готовый массив и выводит его на странице
162 * @param {array} - Отфильтрованный массив новостей
163 */
164function showItems(array) {
165  const newsGrid = document.querySelector('.news-feed__grid')
166  if (newsGrid) {
167    newsGrid.classList.add('collapsed')
168    while (newsGrid.firstChild) { // в цикле удаляем все новости из сетки
169      newsGrid.removeChild(newsGrid.firstChild);
170    }
171
172    for (let i = 0; i < array.length; i++) {
173      newsGrid.append(createMarkup(array[i]))
174    }
175
176    newsGrid.classList.remove('collapsed')
177  }
178}
179
180
181
182
183function getSelected(title, dates, category) {
184  const response = fetch("../json/feed.json") // fetch json
185    .then((response) => response.json())
186    .then((array) => {
187      let cond = { // массив условий поиска
188        string: title.toLowerCase(),
189        dates: dates,
190        category: category,
191      }
192
193      let filtered = filterBy([...new Set(array)], cond)
194      console.log(filtered)
195      console.log(cond)
196      showItems(filtered)
197    })
198}
199
200
201window.onload = function () { // входим в фильтр, когда окно прогрузилось
202  let submitFilters = document.getElementById('news-search-form') // хватаем форму с фильтрами
203  if (submitFilters) { // если элемент содержится на странице
204    submitFilters.addEventListener('submit', (e) => { // добавить прослушиватель на клик
205      e.preventDefault(); // предотвратить обновление страницы после клика на submit
206      const form = e.target;
207      const formFields = form.elements;
208      const dates = formFields.date_search.value;
209      const category = formFields.category_search.value == 'none' ? '' : formFields.category_search.value;
210      const title = formFields.string_search.value ? formFields.string_search.value : ''
211      getSelected(title, dates, category)
212    })
213  }
214}
215
216
217
218// Drupal.behaviors.fetchNews = {
219//   attach: function (context, settings) {
220//     once('fetchNews', 'html').forEach(function (element) {
221//       logNews();
222//     })
223//   }
224// };
225      
226        const sectionNewsCollections = document.querySelectorAll('.news-collection__pagination');
227
228        if (sectionNewsCollections.length > 0) { 
229
230            //Start Кнопка открыть фильтр и закрыть фильтр
231            sectionNewsCollections.forEach( (sectionNewsCollection) => {
232
233            
234                const openBtn = sectionNewsCollection.querySelector('.news-collection__filter-btn');
235
236                if(openBtn){
237                    const filterModal = sectionNewsCollection.querySelector('.news-collection__filter-modal');
238                    const closeBtn = filterModal.querySelector('.news-collection__filter-btn');
239    
240                    closeBtn.addEventListener('click', function () {
241                        filterModal.classList.remove('_active');
242                    });
243    
244                    openBtn.addEventListener('click', function () {
245                        filterModal.classList.add('_active');
246                    })
247                }
248
249
250
251            });
252            //End Кнопка открыть фильтр и закрыть фильтр
253
254            //Start input текущая страница
255            sectionNewsCollections.forEach((sectionNewsCollection, index) => {
256                const paginationTwo = sectionNewsCollection.querySelector('.news-collection__pagination-two');
257                const newPage = paginationTwo.querySelector('.news-collection__pagination-input');
258                const pageMax = newPage.max;
259                const prevLink = sectionNewsCollection.querySelector('.news-collection__pagination-arrow-prev');
260                const nextLink = sectionNewsCollection.querySelector('.news-collection__pagination-arrow-next');
261
262                newPage.addEventListener('keydown', (e) => {
263                    if (e.key === '-') {
264                        e.preventDefault(); // Блокируем ввод символа '-'
265                    }
266                });
267
268                newPage.addEventListener('blur', () => {
269                    if (parseInt(newPage.value, 10) >= pageMax) {
270                        newPage.value = pageMax - 1;
271                    }
272
273                    if(parseInt( pageMax == 1)){
274                        newPage.value = pageMax;
275                    }
276
277                });
278
279                newPage.addEventListener('input', function (event) {
280                    let goPage = event.target.value;
281                    if (Number(goPage) >= Number(pageMax)) {
282                        goPage = pageMax - 1;
283                    }
284
285                    if(parseInt( pageMax == 1)){
286                        goPage = pageMax;
287                    }
288
289                    let href = prevLink.href;
290                    const positionPageStart = Number(href.indexOf('?page=')) + 6;
291                    const positionEnd = Number(href.indexOf('&'));
292                    let newLinkStart = href.substring(0, positionPageStart);
293                    let newLinkEnd = positionEnd === -1 ? '' : href.substring(positionEnd);
294
295                    prevLink.href = newLinkStart + String(Number(goPage) - 1) + newLinkEnd;
296                    nextLink.href = newLinkStart + String(Number(goPage) + 1) + newLinkEnd;
297
298                    const otherNumberPagination = index === 0 ? 1 : 0;
299                    const newPageTwo = sectionNewsCollections[otherNumberPagination].querySelector('.news-collection__pagination-input');
300                    newPageTwo.value = goPage;
301
302                    const prevLinkTwo = sectionNewsCollections[otherNumberPagination].querySelector('.news-collection__pagination-arrow-prev');
303                    const nextLinkTwo = sectionNewsCollections[otherNumberPagination].querySelector('.news-collection__pagination-arrow-next');
304
305                    prevLinkTwo.href = newLinkStart + String(Number(goPage) - 1) + newLinkEnd;
306                    nextLinkTwo.href = newLinkStart + String(Number(goPage) + 1) + newLinkEnd;
307
308                 });
309
310            });
311            //End input текущая страница
312        }
313;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.