Events.js

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

function OnFindNameUsing(url) {
    //  Добавить в коллекцию, чтобы гарантировать что данный объект появится на карте
    Collections.FindName = url;
    //  Найти метку в коллекции всех меток
    var placemark = Collections.AllGeoObjects.search('options.URL = "' + url + '"').get(0);
    if (placemark !== null) {
        //  Установить новый цвет
        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) {
    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 = '';
    Collections.isNeedFilters = false;

    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);
}

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

//  Согласно текущим установленным фильтрам собрать нужный массив данных
function SelectDataFromArrays() {
    var insideMap = Collections.AllGeoObjects.searchInside(Map);
    var afterFilters = new ymaps.geoQuery();
    if (!Collections.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(typeFilters);
            }
        }
        for (e in Collections.Filters.Region) {
            if (Collections.Filters.Region[e]) {
                regionFilters = insideMap.search('options.Regions regexp "{' + e + '}"').add(regionFilters);
            }
        }
        afterFilters = typeFilters.intersect(regionFilters).sort('options.Population desc');
    } 

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


//  Функция создания Яндекс-объекта из одного элемента 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;
    });
    Collections.isNeedFilters = false;
    SelectDataFromArrays();

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

function activeFilters() {
    Collections.isNeedFilters = true;
    SelectDataFromArrays();
}

function checkOriginImportForm() {
    //  выставить значения по дефолту
    //$('input').removeClass('is-valid');
    $('input').removeClass('is-invalid');
    $("#lat-error")[0].innerHTML = 'Неверное значение.';
    $("#long-error")[0].innerHTML = 'Неверное значение.';
    $("#hasBeginning-error")[0].innerHTML = 'Не верный год.';

    var form_data = new Array();

    form_data["url"] = $("input#import-url");
    form_data["title"] = $("input#import-title");
    form_data["lat"] = $("input#import-lat");
    form_data["long"] = $("input#import-long");
    form_data["founder"] = $("input#import-founder");
    form_data["hasBeginning"] = $("input#import-hasBeginning");
    form_data["legend"] = $("textarea#import-legend");

    var valid = true;

    //  регулярное выражение:
    //  ^ - с начала строки
    //  \d\d - две цифры
    //  [.] - разделитель точка
    //  \d+ - после разделителя 1 и более цифр
    //  $ - окончание строки
    //  гарантирует, что введенное значение является координатой
    var coordValidate = /^\d\d[.]\d+$/;
    var lat = form_data["lat"].val();
    var long = form_data["long"].val();

    if (!coordValidate.test(lat)) {
        //  значение не соответствует шаблону
        //  вывод ошибки
        $('#import-lat, #content').addClass('is-invalid');
        valid = false;
    }
    else if (Number(lat) < Collections.MapArea[0][0] || Number(lat) > Collections.MapArea[1][0]) {
        //  значение не попадает в пределы карты
        $("#lat-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
        valid = false;
        $('#import-lat, #content').addClass('is-invalid');
    }

    if (!coordValidate.test(long)) {
        //  значение не соответствует шаблону
        //  вывод ошибки
        $('#import-long, #content').addClass('is-invalid');
        valid = false;
    }
    else if (Number(long) < Collections.MapArea[0][1] || Number(long) > Collections.MapArea[1][1]) {
        //  значение не попадает в пределы карты
        $("#long-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
        valid = false;
        $('#import-long, #content').addClass('is-invalid');
    }

    var year = form_data["hasBeginning"].val();
    if (year !== '') {
        var yearValidate = /^\d{1,4}$/;
        if (!yearValidate.test(year)) {
            //  значение не соответствует шаблону
            //  вывод ошибки
            $('#import-hasBeginning, #content').addClass('is-invalid');
            valid = false;
        }
        else if (Number(year) > MaxYear) {
            //  значение больше текущего года
            $("#hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
            valid = false;
            $('#import-hasBeginning, #content').addClass('is-invalid');
        }
    }

    //  если поля формы верны, составляем строку и возвращаем её для отправки на сервер
    if (valid) {
        var y = '';
        for (key in form_data) {
            //  если поле это url
            //  ему нужна доп проверка
            if (key === 'url') {
                y += '|' + key + '~';
                //  если НЕ установлен флаг "только чтение", т.е. пользователь ВВЕЛ СВОЙ url
                if (!form_data[key][0].readOnly)
                    y += form_data[key].val();
                //  иначе url считается пустым и будет создан на сервере
            }
            else
                y += '|' + key + '~' + form_data[key].val();
        }
        y += '|';
        return y;        
    }
    //  если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
    else
        return null;
}

function checkEditedImportForm() {
    //  выставить значения по дефолту
    //$('input').removeClass('is-valid');
    $('input').removeClass('is-invalid');
    $("#edited-hasBeginning-error")[0].innerHTML = 'Не верный год.';

    var form_data = new Array();

    form_data["url"] = $("input#import-edited-url");
    form_data["beforeTitle"] = $("input#import-before-title");
    form_data["beforeUrl"] = $("input#import-before-url");
    form_data["hasBeginning"] = $("input#import-edited-hasBeginning");
    form_data["source"] = $("input#import-edited-source");
    form_data["title"] = $("input#import-edited-title");
    form_data["populationAll"] = $("input#import-edited-populationAll");
    form_data["populationFemale"] = $("input#import-edited-populationFemale");
    form_data["populationMale"] = $("input#import-edited-populationMale");
    form_data["region"] = $("#import-edited-region");
    form_data["type"] = $("#import-edited-type"); 

    //Вот так можно получить значение атрибута value, выбранной опции:
    //console.log($("#test_228").val());
    //А вот так можно получить текст выбранной опции:
    //console.log($("#test_228 option:selected").text());

    var valid = true;

    

    var year = form_data["hasBeginning"].val();
    if (year !== '') {
        var yearValidate = /^\d{1,4}$/;
        if (!yearValidate.test(year)) {
            //  значение не соответствует шаблону
            //  вывод ошибки
            $('#import-edited-hasBeginning, #content').addClass('is-invalid');
            valid = false;
        }
        else if (Number(year) > MaxYear) {
            //  значение больще текущего года
            $("#edited-hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
            valid = false;
            $('#import-edited-hasBeginning, #content').addClass('is-invalid');
        }
    }

    var digitValidate = /^\d+$/;
    var popAll = form_data["populationAll"].val();
    var popMale = form_data["populationMale"].val();
    var popFemale = form_data["populationFemale"].val();

    if (popAll !== '') {
        if (!digitValidate.test(popAll)) {
            //  значение не соответствует шаблону
            //  вывод ошибки
            $('#import-edited-populationAll, #content').addClass('is-invalid');
            valid = false;
        }
    }

    if (popMale !== '') {
        if (!digitValidate.test(popMale)) {
            //  значение не соответствует шаблону
            //  вывод ошибки
            $('#import-edited-populationMale, #content').addClass('is-invalid');
            valid = false;
        }
    }

    if (popFemale !== '') {
        if (!digitValidate.test(popFemale)) {
            //  значение не соответствует шаблону
            //  вывод ошибки
            $('#import-edited-populationFemale, #content').addClass('is-invalid');
            valid = false;
        }
    }

    //  если поля формы верны, составляем строку и возвращаем её для отправки на сервер
    if (valid) {
        var y = '';
        for (key in form_data) {
            y += '|' + key + '~' + form_data[key].val();
        }
        y += '|';
        return y;
    }
    //  если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
    else
        return null;
}

function importFormSubmit(contentType) {
    var data = '';
    if (contentType === 'origin-import') {
        data = checkOriginImportForm();
    }
    else if (contentType === 'edited-import') {       
        data = checkEditedImportForm();
    }
    if (data !== null) {
        $.when(ImportForm(data, contentType)).done(function (data) {
            console.log(data);
            var text = '';
            $('#modal-result-text').html(data);
            $('#resultDeleteModal').modal();
        });
    } 
}