diff --git a/src/main/resources/static/JavaScript/filtration_script.js b/src/main/resources/static/JavaScript/filtration_script.js index a7a5635..2c589e6 100644 --- a/src/main/resources/static/JavaScript/filtration_script.js +++ b/src/main/resources/static/JavaScript/filtration_script.js @@ -144,38 +144,121 @@ document.addEventListener("DOMContentLoaded", () => { window.location.href = '/main'; }); - const map = L.map("map").setView([60.0, 30.0], 7); // Центр карты - L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png").addTo(map); - - let drawnRectangle; - map.on("click", (e) => { - if (drawnRectangle) map.removeLayer(drawnRectangle); - const bounds = [[e.latlng.lat - 0.1, e.latlng.lng - 0.1], [e.latlng.lat + 0.1, e.latlng.lng + 0.1]]; - drawnRectangle = L.rectangle(bounds, { color: "blue", weight: 1 }).addTo(map); - }); + // =======================Поиск по области на карте==================== +const mapElement = document.getElementById("map"); +const fullscreenControls = document.getElementById("fullscreenControls"); +const confirmSelectionButton = document.getElementById("confirmSelection"); +const exitFullscreenButton = document.getElementById("exitFullscreen"); - document.getElementById("searchByArea").addEventListener("click", () => { - if (drawnRectangle) { - const bounds = drawnRectangle.getBounds(); - const area = { - north: bounds.getNorth(), - south: bounds.getSouth(), - east: bounds.getEast(), - west: bounds.getWest(), - }; - fetch("/api/lakes/searchByArea", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(area), - }) - .then((response) => response.json()) - .then((data) => { - console.log("Найденные озера:", data); - }) - .catch((error) => console.error("Ошибка поиска:", error)); - } else { - alert("Выделите область на карте."); +// Инициализация карты Leaflet +const map = L.map("map").setView([60.0, 30.0], 6); +L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { + maxZoom: 19, +}).addTo(map); + +// Инициализация Leaflet Draw +const drawnItems = new L.FeatureGroup(); +map.addLayer(drawnItems); + +const drawControl = new L.Control.Draw({ + edit: { + featureGroup: drawnItems, + }, + draw: { + polygon: false, + polyline: false, + rectangle: true, + circle: false, + marker: false, + circlemarker: false, + }, +}); +map.addControl(drawControl); + +// Массив для хранения названий найденных озер +const lakeNames = []; + +// Функция для выполнения запроса к Overpass API +const fetchLakesInArea = async (bounds) => { + const [south, west, north, east] = bounds; + const query = ` + [out:json]; + ( + way["natural"="water"]["water"="lake"](${south},${west},${north},${east}); + relation["natural"="water"]["water"="lake"](${south},${west},${north},${east}); + ); + out tags; + `; + const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(query)}`; + + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Ошибка запроса: ${response.status}`); } + const data = await response.json(); + const lakes = data.elements; + + // Очистка текущего массива и добавление названий озер + lakeNames.length = 0; + lakes.forEach((lake) => { + if (lake.tags && lake.tags.name) { + lakeNames.push(lake.tags.name); + } + }); + + console.log("Найденные озера:", lakeNames); + alert(`Найдено ${lakeNames.length} озер. Смотрите консоль для деталей.`); + } catch (error) { + console.error("Ошибка при запросе озер:", error); + alert("Произошла ошибка при поиске озер. Проверьте консоль для деталей."); + } +}; + +// Обработчик завершения рисования +map.on(L.Draw.Event.CREATED, (event) => { + const layer = event.layer; + drawnItems.addLayer(layer); + + // Выделение области цветом + layer.setStyle({ + color: "#00ff00", // Цвет выделенной области + fillOpacity: 0.5, // Прозрачность заливки }); + + // Получение координат области (юг, запад, север, восток) + const bounds = layer.getBounds(); + const south = bounds.getSouth(); + const west = bounds.getWest(); + const north = bounds.getNorth(); + const east = bounds.getEast(); + + // Поиск озер в выделенной области + fetchLakesInArea([south, west, north, east]); +}); + +// Обработчик нажатия на карту для перехода в полноэкранный режим +mapElement.addEventListener("click", () => { + mapElement.classList.add("fullscreen"); + fullscreenControls.classList.add("visible"); +}); + +// Обработчик кнопки "Закрыть" +exitFullscreenButton.addEventListener("click", () => { + mapElement.classList.remove("fullscreen"); + fullscreenControls.classList.remove("visible"); +}); + +// Обработчик кнопки "ОК" +confirmSelectionButton.addEventListener("click", () => { + alert("Выбор области подтвержден!"); + mapElement.classList.remove("fullscreen"); + fullscreenControls.classList.remove("visible"); +}); + + + +// ========================================================================= + }); diff --git a/src/main/resources/static/JavaScript/main_script.js b/src/main/resources/static/JavaScript/main_script.js index 74b302f..14faf37 100644 --- a/src/main/resources/static/JavaScript/main_script.js +++ b/src/main/resources/static/JavaScript/main_script.js @@ -4,4 +4,8 @@ function goFilter(){ function goToProfile(){ window.location.href = '/users/profile/current'; -} \ No newline at end of file +} + +function goSearch(){ + window.location.href = '/lakes/main/search'; +} diff --git a/src/main/resources/static/JavaScript/profile_script.js b/src/main/resources/static/JavaScript/profile_script.js index 682242a..56fee07 100644 --- a/src/main/resources/static/JavaScript/profile_script.js +++ b/src/main/resources/static/JavaScript/profile_script.js @@ -125,3 +125,68 @@ async function updateProfile(newName, newEmail) { alert('Ошибка при обновлении профиля: ' + errorData.message); } } + +document.addEventListener('DOMContentLoaded', () => { + const changePhotoButton = document.getElementById('change-photo-button'); + const savePhotoButton = document.getElementById('save-photo-button'); + const cancelPhotoButton = document.getElementById('cancel-photo-button'); + const photoUrlInput = document.getElementById('photo-url-input'); + + // Показать поле для ввода ссылки + changePhotoButton.addEventListener('click', () => { + photoUrlInput.style.display = 'inline-block'; + savePhotoButton.style.display = 'inline-block'; + cancelPhotoButton.style.display = 'inline-block'; + changePhotoButton.style.display = 'none'; + }); + + // Сохранить новую ссылку на фото + savePhotoButton.addEventListener('click', async () => { + const newPhotoUrl = photoUrlInput.value.trim(); + + if (!newPhotoUrl) { + alert('Введите ссылку на фото.'); + return; + } + + const userId = window.location.pathname.split('/').pop(); + + try { + const response = await fetch(`/users/profile/${userId}/update-photo-url`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ photoUrl: newPhotoUrl }), + }); + + if (response.ok) { + document.getElementById('profile-photo').src = newPhotoUrl; // Обновить фото на странице + alert('Фото обновлено успешно!'); + } else { + const errorData = await response.json(); + alert('Ошибка при обновлении фото: ' + errorData.message); + } + } catch (error) { + alert('Ошибка подключения к серверу.'); + } finally { + resetPhotoEditingState(); // Возвращаем интерфейс в исходное состояние + } + }); + + // Отмена изменения фото + cancelPhotoButton.addEventListener('click', () => { + resetPhotoEditingState(); // Возвращаем интерфейс в исходное состояние + }); + + // Функция для сброса состояния редактирования фото + function resetPhotoEditingState() { + photoUrlInput.style.display = 'none'; + savePhotoButton.style.display = 'none'; + cancelPhotoButton.style.display = 'none'; + changePhotoButton.style.display = 'inline-block'; + photoUrlInput.value = ''; // Очистить поле ввода + } +}); + + diff --git a/src/main/resources/static/JavaScript/statisticks_script.js b/src/main/resources/static/JavaScript/statisticks_script.js new file mode 100644 index 0000000..e69de29