Events.js

257 lines | 10.492 kB Blame History Raw Download
//  Функция обработчик движения слайдера
function SliderOnFinishMoving(data) {   
    CurrentMinYear = data.min;
    CurrentMaxYear = data.max;
    GetAllPoints(CurrentMinYear, CurrentMaxYear);
}

function OnFindNameUsing(name) {
    //  Добавить в коллекцию, чтобы гарантировать что данный объект появится на карте
    Collections.FindName = name;
    //  Найти метку в коллекции всех меток
    var placemark = Collections.AllGeoObjects.search('options.Name = "' + name + '"').get(0);
    //  Установить новый цвет
    placemark.options.set('preset', 'islands#greenStretchyIcon');
    //  Отцентрировать карту и приблизить
    Map.setCenter(placemark.geometry.getCoordinates(), 13);
    //  Через 5 секунд вернуть обратно прежний цвет
    setTimeout(changePlacemarkPreset, 5000, placemark, 'islands#redStretchyIcon');
}

function changePlacemarkPreset(placemark, preset) {
    placemark.options.set('preset', preset);
}

//  Заполнение массивов из исходного (response.data)
//  В соответствии с параметрами поселения
function FillDataArrays(fromData, isNeedSelect = false, isNeedPlaceCollection = false) {

    Collections.AllGeoObjects.removeFromMap(Map);

    Collections.All = new Array();
    Collections.AllGeoObjects = new ymaps.geoQuery();
    Collections.SettlementTypes = new Array();
    Collections.Regions = new Array();
    Collections.Names = new Array();
    Collections.FindName = '';

    console.log('Количество загруженных поселений ' + fromData.arraySettlements.length);
    
    Collections.Names = fromData.arrayNameSettlements;
    Collections.SettlementTypes = fromData.arrayNameTypes;
    Collections.Regions = fromData.arrayNameRegions;   
    AutoCompleteInit(Collections.Names);

    Collections.All = fromData.arraySettlements;
    LoadCollection(fromData.arraySettlements, isNeedSelect, isNeedPlaceCollection);
}

//  Функция заполнения Яндекс-коллекций Яндекс-объектами из JSON массива
function LoadCollection(fromData, isNeedSelect = false, isNeedPlaceCollection = false) {
    fromData.forEach(function (element) {
        Collections.AllGeoObjects = Collections.AllGeoObjects.add(CreateYandexPlacemark(element)); //  Добавление
    });
    if (isNeedSelect)
        SelectDataFromArrays(isNeedPlaceCollection);
}

//  Согласно текущим установленным фильтрам собрать нужный массив данных
function SelectDataFromArrays(isNeedPlaceCollection = false) {
    var ResultDataArray = new Array();   

    var CollectionVisible = Collections.AllGeoObjects.searchInside(Map).slice(0, Collections.VisibleCount).addToMap(Map);
    // Оставшиеся объекты будем удалять с карты.
    Collections.AllGeoObjects.remove(CollectionVisible).removeFromMap(Map).getLength();

    //for (var i = 0; i < Collections.All.length && i < Collections.VisibleCount; i++) {
    //    ResultDataArray.push(Collections.All[i]);
    //}

    //if (isNeedPlaceCollection)
    //    PlaceFromCollection(geo_query);
    return ResultDataArray;
}


//  Функция создания Яндекс-объекта из одного элемента JSON массива
function CreateYandexPlacemark(fromElement) {
    var coord = fromElement.Position.split(' ');
    var placemark = new ymaps.Placemark([coord[0], coord[1]],
        {
            iconContent: fromElement.Title,   //  Содержимое названия
            hintContent: fromElement.Position//  Содержимое подписи при наведении
        },
        {
            preset: 'islands#redStretchyIcon'
        }
    );

    //Добавить свойство - Имя поселения
    placemark.options.set('Name', fromElement.Title);
    placemark.options.set('URL', fromElement.URL);
    placemark.options.set('Population', fromElement.Population);
    placemark.options.set('Types', fromElement.Type);
    placemark.options.set('Regions', fromElement.Region);

    //  Переопределяем стадартный обработчик нажатия
    placemark.events.add('click', function (e) {
        e.preventDefault(); //  Запрещаем стандартный обработчик

        var targetURL = e.get('target').options.get('URL');

        //  Вызов запроса на получение данных о поселении
        GetInfoAboutSettlement(targetURL, PrintInfoAboutSettlement);
        //  Показать боковую панель
        if ($('#sidebar-left, #content').hasClass('active')) {
            //  Панель скрыта. Должна выехать
            $('#sidebar-left, #content').removeClass('active');
            $('.collapse.in').toggleClass('in');
            $('a[aria-expanded=true]').attr('aria-expanded', 'false');
        }
        else
            //  Панель есть. Выбор, нужно ли её скрывать
            if (targetURL == document.getElementById('settlement-url').innerHTML) {
                $('#sidebar-left, #content').addClass('active');
                $('.collapse.in').toggleClass('in');
                $('a[aria-expanded=true]').attr('aria-expanded', 'false');
            }


    });
    return placemark;
}


// функция динамической сортировки
function compareValues(key, order = 'asc') {
    return function (a, b) {
        if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
            // свойства нет ни в одном из объектов
            return 0;
        }

        const varA = (typeof a[key] === 'string') ?
            a[key].toUpperCase() : a[key];
        const varB = (typeof b[key] === 'string') ?
            b[key].toUpperCase() : b[key];

        let comparison = 0;
        if (varA > varB) {
            comparison = 1;
        } else if (varA < varB) {
            comparison = -1;
        }
        return (
            (order == 'desc') ? (comparison * -1) : comparison
        );
    };
}

function OpenRightPanel(addclass) {
    $('#sidebar-right, #content').removeClass('active');
    $('#sidebar-right, #content').addClass(addclass);
    $('.collapse.in').toggleClass('in');
    $('a[aria-expanded=true]').attr('aria-expanded', 'false');  
}

function CloseRightPanel() {
    $('#sidebar-right, #content').addClass('active');
    $('#sidebar-right, #content').removeClass('export');
    $('#sidebar-right, #content').removeClass('import');
    $('.collapse.in').toggleClass('in');
    $('a[aria-expanded=true]').attr('aria-expanded', 'false');
}

function exportSidebarButton() { 
    //  панель закрыта
    if ($('#sidebar-right, #content').hasClass('active')) {
        switchRightSidebar('export');
        OpenRightPanel('export');
    }//  панель открыта
    else {
        //  был открыт импорт, нужно обновить содержимое
        if ($('#sidebar-right, #content').hasClass('import')) {
            switchRightSidebar('export');
            $('#sidebar-right, #content').removeClass('import');
            $('#sidebar-right, #content').addClass('export');
        }
        //  был открыт экспорт, при повторном нажатии нужно скрыть панель
        else
            CloseRightPanel();
    }
}

function importSidebarButton() {
    //  панель закрыта
    if ($('#sidebar-right, #content').hasClass('active')) {
        switchRightSidebar('import');
        OpenRightPanel('import');
    }//  панель открыта
    else {
        //  был открыт экспорт, нужно обновить содержимое
        if ($('#sidebar-right, #content').hasClass('export')) {
            switchRightSidebar('import');
            $('#sidebar-right, #content').removeClass('export');
            $('#sidebar-right, #content').addClass('import');
        }
        //  был открыт импорт, при повторном нажатии нужно скрыть панель
        else
            CloseRightPanel();
    }    
}

function switchRightSidebar(flag) {
    if (flag === 'export')
    {
        printExportCollection();
        document.getElementById('sidebar-right-header-title').innerHTML = 'Экспорт';
        document.getElementById('export-to-word').hidden = false;
        document.getElementById('export-to-excel').hidden = false;
        document.getElementById('sidebar-right-text-export').hidden = false;

        document.getElementById('import-button').hidden = true;
        document.getElementById('sidebar-right-text-import').hidden = true;
    } else if (flag === 'import')
    {
        document.getElementById('sidebar-right-header-title').innerHTML = 'Импорт';
        document.getElementById('export-to-word').hidden = true;
        document.getElementById('export-to-excel').hidden = true;
        document.getElementById('sidebar-right-text-export').hidden = true;

        document.getElementById('import-button').hidden = false;
        document.getElementById('sidebar-right-text-import').hidden = false;
    }
    
}

function checkBoxChange(e) {
    if (e.checked) {
        // пользователь передумал и решил вернуть поселение в экспорт   
        var element = new Object();
        element.name = e.parentElement.innerText;
        element.url = e.id;
        Collections.Export.push(element);
    }
    else
    {
        //  пользователь убрал отметку экспорта. удаляем поселение из коллекции
        //  но отрисовку пока не делаем, вдруг он захочет вернуть отметку (т.е. добавить в экспорт)
        Collections.Export = jQuery.grep(Collections.Export, function (element) {
            return element.url != e.id;
        });
    }
}

function addToExport() {
    var element = new Object();
    element.name = $("#settlement-title")[0].innerHTML;
    element.url = $("#settlement-url")[0].innerHTML;

    //  нельзя добавить уже добавленное поселение
    if (!Collections.Export.some(currentValue => currentValue.url == element.url)){
        Collections.Export.push(element);
        printExportCollection();
    }
    
}