let cityObj = {
"modelName": "Address",
"calledMethod": "getCities",
"methodProperties": {},
"apiKey": apiKey
};
let xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.novaposhta.ua/v2.0/json/');
xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
//Отправка данных на сервер
xhr.send(JSON.stringify(cityObj));
//проверяем состояние запроса
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState < 4) {
} else if (xhr.readyState === 4 && xhr.status === 200) {
let city = [];
let obj = {};
let cities = JSON.parse(xhr.response);
for (let i = 0; i < cities.data.length; i++) {
obj = {
Ref: cities.data[i].Ref,
Description: cities.data[i].Description
};
//Сформировали справочник населенных пунктов
city.push(obj);
}
console.log(city); //получаем массив из 4000+ населенных пунктов
//Далее вся логика(живой поиск, формирование выпадающего списка, другие действия)
} else {
console.log('Что то пошло не так');
}
});
app.get('/city', function(req,res){
if (!req.body) return res.sendStatus(400);
let cityObj = {
"modelName": "Address",
"calledMethod": "getCities",
"methodProperties": {},
"apiKey": 'apiKey'
};
request.post('https://api.novaposhta.ua/v2.0/json/', {form: cityObj}, function (error, response, body) {
let data = body; //массив с городами
res.send(data);
});
});
let cargoType = calcForm.elements['cargo-type'];
const cargoTypeObj = {
"modelName": "Common",
"calledMethod": "getCargoTypes",
"methodProperties": {},
"apiKey": apiKey
};
sendAjax(cargoType, cargoTypeObj);
function sendAjax(elem, reqObj) {
let xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.novaposhta.ua/v2.0/json/');
xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
//Отправка данных на сервер
xhr.send(JSON.stringify(reqObj));
//проверяем состояние запроса
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState < 4) {
} else if (xhr.readyState === 4 && xhr.status === 200) {
let type = JSON.parse(xhr.response);
for(let i = 0; i < type.data.length; i++) {
createOptions(type.data[i]);
elem.append(createOptions(type.data[i]));
}
//Формируем данные в декоративном селекте
if(cargoType.previousElementSibling.hasAttribute('data-select')){
let select = elem.previousElementSibling.querySelector('.form-select__dropdown');
for(let i = 0; i < type.data.length; i++) {
createSelectItem(type.data[i]);
select.append(createSelectItem(type.data[i]));
}
}
} else {
console.log('Что то пошло не так');
}
});
}
//Создаем пункты реального селекта ++
function createOptions(data){
//Формируем реальный селект
let opt = document.createElement('option');
opt.value = data.Ref;
opt.textContent = data.Description;
return opt;
}
//Создаем пункты декоративного селекта ++
function createSelectItem(data) {
let selectItem = document.createElement('div');
selectItem.classList.add('form-select__item');
selectItem.setAttribute('data-select-item', data.Ref);
selectItem.textContent = data.Description;
return selectItem;
}
//используем этот запрос для живого поиска
app.post('/city', function(req,res){
let text = req.body.text;
let val = text.trim().toLowerCase(); // приходит от пользователя
console.log(val);
let city = arr.filter(el => {
if(val){
return el.Description.toLowerCase().search(val) !== -1;
}
});
res.send(city); // возвращаем массив с данными иначе пустой массив
});
app.listen(PORT, function(){
console.log(`Прослушиваем порт по адресу ${PORT}`);
//Формируем справочник городов компании
let cityObj = {
"modelName": "Address",
"calledMethod": "getCities",
"methodProperties": {},
"apiKey": apiKey
};
request.post(
'https://api.novaposhta.ua/v2.0/json/',
{
json: cityObj,
headers: {
"Content-type": "application/json",
}
},
function (error, response, body) {
let data = body;
for(let i = 0; i < data.data.length; i++) {
arr.push(data.data[i]);
console.log(arr[i]);
}
});
});
let city = calcForm.elements['cargo-city-to'];
if(city.previousElementSibling.hasAttribute('data-select')){
let el = city.previousElementSibling.querySelector('[data-select-title]');
el.setAttribute('contenteditable', true);
el.addEventListener('focus', function(){
this.textContent = '';
});
el.addEventListener('input', function(){
//Очистка декоративных пунктов
let selected = city.previousElementSibling.querySelectorAll('[data-select-item]');
selected.forEach(el => {
console.log(el.textContent);
el.remove();
});
//очистка стандартного селекта
for(let i = 0; i < city.options.length; i++){
city.remove(i);
}
//Запрос живого поиска
let xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3010/city');
xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
//Отправка данных на сервер
xhr.send(JSON.stringify({text: this.textContent}));
console.log(this.textContent);
//проверяем состояние запроса
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState < 4) {
} else if (xhr.readyState === 4 && xhr.status === 200) {
let data = JSON.parse(xhr.response);
for(let i = 0; i < data.length; i++) {
//Формируем список опций у реального селекта
createOptions(data[i]);
city.append(createOptions(data[i]));
}
//Формируем данные в декоративном селекте
if(city.previousElementSibling.hasAttribute('data-select')){
let select = city.previousElementSibling.querySelector('.form-select__dropdown');
for(let i = 0; i < data.length; i++) {
createSelectItem(data[i]);
select.append(createSelectItem(data[i]));
}
}
} else {
console.log('Что то пошло не так');
}
});
});
}else{
console.log('---');
}
getCity(city, `http://localhost:3010/city`);
//Изначально загружаем с сервера 5 записей из массива городов (что бы декоративный селект имел некоторый список по умолчанию)
function getCity(elem, url){
let xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
//Отправка данных на сервер
xhr.send();
//проверяем состояние запроса
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState < 4) {
} else if (xhr.readyState === 4 && xhr.status === 200) {
let data = JSON.parse(xhr.response);
for(let i = 0; i < 5; i++) {
createOptions(data[i]);
elem.append(createOptions(data[i]));
}
//Формируем данные в декоративном селекте
if(elem.previousElementSibling.hasAttribute('data-select')){
let select = elem.previousElementSibling.querySelector('.form-select__dropdown');
for(let i = 0; i < 5; i++) {
createSelectItem(data[i]);
select.append(createSelectItem(data[i]));
}
}
} else {
console.log('Что то пошло не так');
}
});
}
//Получение городов компании
let cityTo = calcForm.elements['cargo-city-to'];
let cityFrom = calcForm.elements['cargo-city'];
checkKeyCity('Mycity', cityTo);
checkKeyCity('Mycity', cityFrom);
//Получение куки
function getCookie(name) {
let matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
//Загрузка городов в localStorage
function getCities(){
let date = new Date();
date = new Date(date.setDate(date.getDate() + 1));
let cityObj = {
"modelName": "Address",
"calledMethod": "getCities",
"methodProperties": {},
"apiKey": apiKey
};
let xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.novaposhta.ua/v2.0/json/');
xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
//Отправка данных на сервер
xhr.send(JSON.stringify(cityObj));
//проверяем состояние запроса
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState < 4) {
} else if (xhr.readyState === 4 && xhr.status === 200) {
let city = [];
let obj = {};
let cities = JSON.parse(xhr.response);
for (let i = 0; i < cities.data.length; i++) {
obj = {
Ref: cities.data[i].Ref,
Description: cities.data[i].Description
};
//Сформировали справочник населенных пунктов
city.push(obj);
}
localStorage.setItem('Mycity', JSON.stringify(city));
} else {
console.log('Что то пошло не так');
}
});
document.cookie = `${decodeURI('cities')} = ${decodeURI(true)}; expires = ${date}; path = /`;
}
//Проверка наличие куки
if(getCookie('cities') === undefined) {
getCities();
}
//Проверка наличия ключа в localStorage
function checkKeyCity(key, element){
if (localStorage.getItem(key) !== null){
let data = JSON.parse(localStorage.getItem(key));
//Формируем данные в селекте
for(let i = 0; i < data.length; i++) {
createOptions(data[i]);
element.append(createOptions(data[i]));
}
//Формируем данные в декоративном селекте
if(element.previousElementSibling.hasAttribute('data-select')){
let select = element.previousElementSibling.querySelector('.form-select__dropdown');
select.overflowY = 'scroll';
for(let i = 0; i < data.length; i++) {
createSelectItem(data[i]);
select.append(createSelectItem(data[i]));
}
}
let el = element.previousElementSibling.querySelector('[data-select-title]');
el.setAttribute('contenteditable', true);
el.addEventListener('focus', function(){
this.textContent = '';
});
//Живой поиск ++
el.addEventListener('input', function(){
element.previousElementSibling.querySelector('.form-select__dropdown').classList.remove('hidden');
let val = this.textContent.trim().toLowerCase();
let items = element.previousElementSibling.querySelectorAll('.form-select__item');
if(val != ''){
items.forEach(function(elem) {
if(elem.textContent.toLowerCase().search(val) == -1) {
elem.classList.add('hidden');
}else{
elem.classList.remove('hidden');
}
});
}else{
items.forEach(function(elem) {
elem.classList.remove('hidden');
});
}
});
}
}