MediaWiki:Filters.js

Материал из ultracity
Перейти к навигации Перейти к поиску

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
document.getElementById('filter-form').addEventListener('submit', function(event) {
    event.preventDefault(); // Предотвращаем перезагрузку страницы

    // Получаем значения из формы
    const городElement = document.getElementById('город');
    const районElement = document.getElementById('район');
    const типПомещенияElement = document.getElementById('тип-помещения');
    const улицаElement = document.getElementById('улица');
    const номерДомаElement = document.getElementById('номер-дома');
    const ценаОтElement = document.getElementById('цена-от');
    const ценаДоElement = document.getElementById('цена-до');
    const площадьОтElement = document.getElementById('площадь-от');
    const площадьДоElement = document.getElementById('площадь-до');

    const город = городElement ? городElement.value : '';
    const район = районElement ? районElement.value : '';
    const типПомещения = типПомещенияElement ? типПомещенияElement.value : '';
    const улица = улицаElement ? улицаElement.value : '';
    const номерДома = номерДомаElement ? номерДомаElement.value : '';
    const ценаОт = ценаОтElement ? ценаОтElement.value : '';
    const ценаДо = ценаДоElement ? ценаДоElement.value : '';
    const площадьОт = площадьОтElement ? площадьОтElement.value : '';
    const площадьДо = площадьДоElement ? площадьДоElement.value : '';

    // Формируем запрос к API Semantic MediaWiki
    let query = `[[Категория:Коммерческая недвижимость]]`;
    if (город) query += `[[город::${город}]]`;
    if (район) query += `[[район::${район}]]`;
    if (типПомещения) query += `[[тип помещения::${типПомещения}]]`;
    if (улица) query += `[[Улица::${улица}]]`;
    if (номерДома) query += `[[Номер дома::${номерДома}]]`;

    // Добавляем фильтрацию по цене
    if (ценаОт) query += `[[Цена::>${ценаОт}]]`;
    if (ценаДо) query += `[[Цена::<${ценаДо}]]`;

    // Добавляем фильтрацию по площади
    if (площадьОт) query += `[[Площадь::>${площадьОт}]]`;
    if (площадьДо) query += `[[Площадь::<${площадьДо}]]`;

    // Указываем свойства для извлечения
    query += '|?Город|?Район|?Тип помещения|?Улица|?Номер дома|?Этаж|?Площадь|?Цена';

    // Устанавливаем высокий лимит для количества возвращаемых результатов
    const apiUrl = `/api.php?action=ask&query=${encodeURIComponent(query)}&format=json&limit=5000`;
    console.log('Сформированный запрос:', query);

    // Выполняем запрос к API
    fetch(apiUrl)
        .then(response => response.json())
        .then(data => {
            console.log('Ответ API:', data);

            if (!data.query || !data.query.results) {
                console.error('Нет данных results в ответе API');
                document.getElementById('results').innerHTML = '<p>Нет данных.</p>';
                return;
            }

            const results = data.query.results;
            let html = '<table class="wikitable">';
            html += '<tr><th>ID</th><th>Город</th><th>Район</th><th>Тип помещения</th><th>Адрес</th><th>Этаж</th><th>Площадь</th><th>Цена</th></tr>';

            // Перебираем найденные страницы
            for (const page in results) {
                if (results.hasOwnProperty(page)) {
                    const properties = results[page].printouts;
                    console.log(`Свойства страницы ${page}:`, properties);

                    // Извлекаем значения свойств
                    const город = properties.Город && properties.Город[0] ? (properties.Город[0].fulltext || properties.Город[0]) : 'Нет данных';
                    const район = properties.Район && properties.Район[0] ? (properties.Район[0].fulltext || properties.Район[0]) : 'Нет данных';
                    const типПомещения = properties['Тип помещения'] && properties['Тип помещения'][0] ? (properties['Тип помещения'][0].fulltext || properties['Тип помещения'][0]) : 'Нет данных';
                    const улица = properties.Улица ? properties.Улица.join(', ') : 'Нет данных';
                    const номерДома = properties['Номер дома'] ? properties['Номер дома'].join(', ') : 'Нет данных';
                    const этаж = properties.Этаж ? properties.Этаж.join(', ') : 'Нет данных';

                    // Обработка свойства "Площадь"
                    let площадь = 'Нет данных';
                    if (properties.Площадь && properties.Площадь.length > 0) {
                        const obj = properties.Площадь[0];
                        if (obj && typeof obj === 'object') {
                            площадь = obj.fulltext || (obj.value + (obj.unit ? ' ' + obj.unit : '')) || JSON.stringify(obj);
                        } else {
                            площадь = properties.Площадь.join(', ');
                        }
                    }

                    // Обработка свойства "Цена"
                    let цена = 'Нет данных';
                    if (properties.Цена && properties.Цена.length > 0) {
                        const obj = properties.Цена[0];
                        if (obj && typeof obj === 'object') {
                            цена = obj.fulltext || obj.value; // Извлекаем значение без добавления 'руб.'
                        } else {
                            цена = properties.Цена.join(', ');
                        }
                    }

                    // Формируем адрес
                    const адрес = (улица !== 'Нет данных' && номерДома !== 'Нет данных') ?
                                  `${улица} ${номерДома}` : 'Нет данных';

                    // Заменяем пробелы на подчеркивания
                    const адресДляСсылки = адрес.replace(/\s/g, '_');

                    // Добавляем строку в таблицу, делая ID и адрес кликабельными
                    html += `<tr>
                        <td><a href="${encodeURIComponent(page)}" target="_blank">${page}</a></td>
                        <td>${город}</td>
                        <td>${район}</td>
                        <td>${типПомещения}</td>
                        <td><a href="${encodeURIComponent(адресДляСсылки)}" target="_blank">${адрес}</a></td>
                        <td>${этаж}</td>
                        <td>${площадь}</td>
                        <td>${цена} руб.</td>
                    </tr>`;
                }
            }

            html += '</table>';
            document.getElementById('results').innerHTML = html;
        })
        .catch(error => {
            console.error('Ошибка при загрузке данных:', error);
            document.getElementById('results').innerHTML = '<p>Ошибка при загрузке данных.</p>';
        });
});