/* ДЗ 6.1 - Асинхронность и работа с сетью */
/**
* Функция должна создавать Promise, который должен быть resolved через seconds секунду после создания
*
* @param {number} seconds - количество секунд, через которое Promise должен быть resolved
* @return {Promise}
*/
function delayPromise(seconds) {
seconds = 1000;
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();
}, seconds);
});
}
/**
* Функция должна вернуть Promise, который должен быть разрешен массивом городов, загруженным из
* https://raw.githubusercontent.com/smelukov/citiesTest/master/cities.json
* Элементы полученного массива должны быть отсортированы по имени города
*
* @return {Promise>}
*/
function loadAndSortTowns() {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://raw.githubusercontent.com/smelukov/citiesTest/master/cities.json');
xhr.responseType = 'json';
xhr.addEventListener('load', () => {
resolve(xhr.response.sort(function (a, b) {
if (a.name > b.name) {
return 1;
}
if (a.name < b.name) {
return -1;
}
return 0;
}));
});
xhr.send();
});
}
export {
delayPromise,
loadAndSortTowns
};
/**
* ДЗ 6.2 - Создать страницу с текстовым полем для фильтрации городов
*
* Страница должна предварительно загрузить список городов из
* https://raw.githubusercontent.com/smelukov/citiesTest/master/cities.json
* и отсортировать в алфавитном порядке.
*
* При вводе в текстовое поле, под ним должен появляться список тех городов,
* в названии которых, хотя бы частично, есть введенное значение.
* Регистр символов учитываться не должен, то есть "Moscow" и "moscow" - одинаковые названия.
*
* Во время загрузки городов, на странице должна быть надпись "Загрузка..."
* После окончания загрузки городов, надпись исчезает и появляется текстовое поле.
*
* Запрещено использовать сторонние библиотеки. Разрешено пользоваться только тем, что встроено в браузер
*
* *** Часть со звездочкой ***
* Если загрузка городов не удалась (например, отключился интернет или сервер вернул ошибку),
* то необходимо показать надпись "Не удалось загрузить города" и кнопку "Повторить".
* При клике на кнопку, процесс загруки повторяется заново
*/
/**
* homeworkContainer - это контейнер для всех ваших домашних заданий
* Если вы создаете новые html-элементы и добавляете их на страницу, то дабавляйте их только в этот контейнер
*
* @example
* homeworkContainer.appendChild(...);
*/
let homeworkContainer = document.querySelector('#homework-container');
/**
* Функция должна загружать список городов из https://raw.githubusercontent.com/smelukov/citiesTest/master/cities.json
* И возвращать Promise, которой должен разрешиться массивом загруженных городов
*
* @return {Promise>}
*/
function loadTowns() {
return townsPromise = new Promise((resolve) => {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://raw.githubusercontent.com/smelukov/citiesTest/master/cities.json');
xhr.responseType = 'json';
xhr.addEventListener('load', () => {
loadingBlock.innerHTML = '';
filterBlock.style.display = 'inline-block';
resolve(xhr.response.sort(function (a, b) {
if (a.name > b.name) {
return 1;
}
if (a.name < b.name) {
return -1;
}
return 0;
}));
});
xhr.send();
});
}
/**
* Функция должна проверять встречается ли подстрока chunk в строке full
* Проверка должна происходить без учета регистра символов
*
* @example
* isMatching('Moscow', 'moscow') // true
* isMatching('Moscow', 'mosc') // true
* isMatching('Moscow', 'cow') // true
* isMatching('Moscow', 'SCO') // true
* isMatching('Moscow', 'Moscov') // false
*
* @return {boolean}
*/
function isMatching(full, chunk) {
if (full.toLowerCase().indexOf(chunk.toLowerCase()) !== -1) {
return true;
} else {
return false;
}
}
let loadingBlock = homeworkContainer.querySelector('#loading-block');
let filterBlock = homeworkContainer.querySelector('#filter-block');
let filterInput = homeworkContainer.querySelector('#filter-input');
let filterResult = homeworkContainer.querySelector('#filter-result');
let townsPromise;
let cities = [];
loadTowns()
.then(res => {
cities = res;
loadingBlock.style.display = 'none';
filterBlock.style.display = 'block';
});
filterInput.addEventListener('keyup', function () {
filterResult.innerHTML = filterInput.value ?
cities
.filter(item => isMatching(item.name, filterInput.value))
.map(item => `${item.name}
`)
.join('')
: '';
});
export {
loadTowns,
isMatching
};