Events.js

347 lines | 13.353 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, isNeedFilters = 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);
    filterCollectionInit(Collections.Filters.Type, Collections.SettlementTypes, 'filterGroupTypes', 'countTypes');
    filterCollectionInit(Collections.Filters.Region, Collections.Regions, 'filterGroupRegions', 'countRegions');

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

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

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

    console.log("select with " + isNeedFilters);
    isNeedFilters=false;
    var insideMap = Collections.AllGeoObjects.searchInside(Map);
    var afterFilters = new ymaps.geoQuery();
    if (!isNeedFilters) 
        afterFilters = insideMap;
    else        
        {
            var typeFilters = new ymaps.geoQuery();
            var regionFilters = new ymaps.geoQuery();

            //  тут применить фильтры
            //  объединить по признаку типа 
            //  объединить по признаку региона
            //  пересечь две выборки

            for (e in Collections.Filters.Type) {
                if (Collections.Filters.Type[e]) {
                    typeFilters = insideMap.search('options.Types regexp "{|' + e + '}"').add(regionFilters);
                }
            }
            for (e in Collections.Filters.Region) {
                if (Collections.Filters.Region[e]) {
                    regionFilters = insideMap.search('options.Regions regexp "{' + e + '}"').add(regionFilters);
                }
            }

            afterFilters = typeFilters.intersect(regionFilters);
        }
    

//filterTypes = all.search('options.Regions regExp "*|gorod|*"') 
// .add(all.search('options.Regions regExp "*|selo|*"')) 
// .add(all.search('options.Regions regExp "*|poselok|*"'))

    //for (e in Collections.Filters.Type) {
    //    if (Collections.Filters.Type[e])
    //    {
    //        for 
    //    }
    //        afterFilters = afterFilters.search('options.Name = "' + name + '"');
    //}
    //for (e in Collections.Filters.Region) {
    //    Collections.Filters.Region[e] = true;
    //}

    var CollectionVisible = afterFilters.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'
        }
    );

    function compose (elem) {
        var t = '';
        fromElement[elem].forEach(function (element) {
            t += ' {' + element + '}';
        });
        return t + ' ';
    }

    //Добавить свойство - Имя поселения
    placemark.options.set('Name', fromElement.Title);
    placemark.options.set('URL', fromElement.URL);
    placemark.options.set('Population', fromElement.Population);
    placemark.options.set('Types', compose('Type'));
    placemark.options.set('Regions', compose('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();
    }
    
}

function filterRegionChange(e) {
    //console.log($("#"+e.id));
    var name = e.parentElement.parentElement.parentElement.children[1].innerText;
    Collections.Filters.Region[name] = e.checked;
}

function filterTypeChange(e) {
    //console.log($("#" + e.id));
    var name = e.parentElement.parentElement.parentElement.children[1].innerText;
    Collections.Filters.Type[name] = e.checked;
}

function defaultFilters() {

    for (e in Collections.Filters.Type) {
        Collections.Filters.Type[e] = true;
    } 
    for (e in Collections.Filters.Region) {
        Collections.Filters.Region[e] = true;
    }

    $("#filterGroups input").each(function (index, element) {
        element.checked = true;
    });
    SelectDataFromArrays(false);

    //console.log($("#filterGroupRegions")[0].children);
}

function activeFilters() {
    SelectDataFromArrays(true);
}