mirror of
https://github.com/claradex/nativegallery.git
synced 2024-12-22 16:41:04 +03:00
add new labels to config
This commit is contained in:
parent
eacb4f498e
commit
7d9ce1071f
2 changed files with 416 additions and 389 deletions
|
@ -30,5 +30,11 @@ ngallery:
|
|||
img:
|
||||
proxy: true
|
||||
percent: 50
|
||||
photo:
|
||||
upload:
|
||||
premoderation: true
|
||||
defaultindex: 5.0
|
||||
comments:
|
||||
premoderation: false
|
||||
|
||||
|
|
@ -1,43 +1,45 @@
|
|||
<?php
|
||||
|
||||
use \App\Services\{Auth, DB};
|
||||
use \App\Models\User;
|
||||
|
||||
$user = new User(Auth::userid());
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/LoadHead.php'); ?>
|
||||
<?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/LoadHead.php'); ?>
|
||||
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<div id="backgr"></div>
|
||||
<table class="tmain">
|
||||
<?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/Navbar.php'); ?>
|
||||
<?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/Navbar.php'); ?>
|
||||
<tr>
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />
|
||||
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
|
||||
<script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
|
||||
<script src="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Cesium.js"></script>
|
||||
<link href="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-indoor/0.4.2/leaflet.indoor.min.js"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet-indoor/0.4.2/leaflet.indoor.min.css" />
|
||||
<!-- Подключение плагина Leaflet.markercluster -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.Default.css">
|
||||
<script src="https://unpkg.com/leaflet.markercluster/dist/leaflet.markercluster.js"></script>
|
||||
<!-- Подключение плагина Leaflet-Geoman -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet-geoman-free/dist/leaflet-geoman.css">
|
||||
<script src="https://unpkg.com/leaflet-geoman-free/dist/leaflet-geoman.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />
|
||||
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
|
||||
<script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
|
||||
<script src="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Cesium.js"></script>
|
||||
<link href="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-indoor/0.4.2/leaflet.indoor.min.js"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet-indoor/0.4.2/leaflet.indoor.min.css" />
|
||||
<!-- Подключение плагина Leaflet.markercluster -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.Default.css">
|
||||
<script src="https://unpkg.com/leaflet.markercluster/dist/leaflet.markercluster.js"></script>
|
||||
<!-- Подключение плагина Leaflet-Geoman -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet-geoman-free/dist/leaflet-geoman.css">
|
||||
<script src="https://unpkg.com/leaflet-geoman-free/dist/leaflet-geoman.min.js"></script>
|
||||
|
||||
<!-- Подключение плагина Leaflet-3d-model -->
|
||||
<script src="https://unpkg.com/leaflet-3d-model/dist/leaflet-3d-model.min.js"></script>
|
||||
<!-- Подключение плагина Leaflet-3d-model -->
|
||||
<script src="https://unpkg.com/leaflet-3d-model/dist/leaflet-3d-model.min.js"></script>
|
||||
<td class="main">
|
||||
<h1>Предложить фото на публикацию</h1>
|
||||
<p>Ваш текущий индекс загрузки: <b><?=$user->i('uploadindex')?></b></p>
|
||||
<p>Ваш текущий индекс загрузки: <b><?= $user->i('uploadindex') ?></b></p>
|
||||
<script>
|
||||
var UPLOAD_JPG_MAX_PX = 2500;
|
||||
var UPLOAD_PNG_MAX_PX = 0;
|
||||
|
@ -299,11 +301,11 @@ $user = new User(Auth::userid());
|
|||
Шаг 1. <b>Выберите фотографию для загрузки и укажите дату съёмки:</b> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
|
||||
|
||||
<td></td>
|
||||
<td style="padding:2px 15px 5px 2px">
|
||||
|
||||
|
||||
<label class="button">
|
||||
Выбрать файл... <input type="file" name="image" id="image" accept="image/*">
|
||||
</label>
|
||||
|
@ -552,7 +554,7 @@ $user = new User(Auth::userid());
|
|||
</tr>
|
||||
</tbody>
|
||||
|
||||
|
||||
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
|
@ -595,7 +597,7 @@ $user = new User(Auth::userid());
|
|||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td colspan="2" style="height:7px"></td>
|
||||
<tr>
|
||||
|
@ -607,394 +609,413 @@ $user = new User(Auth::userid());
|
|||
</tr>
|
||||
</tbody>
|
||||
|
||||
|
||||
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2" style="height:10px"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
<tbody class="p20">
|
||||
<tr>
|
||||
<td colspan="2" id="step4" class="narrow" style="font-size:20px; padding:10px 15px 0">Шаг 3. <b>Отметьте точку, с которой вы делали кадр, на карте:</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="padding:7px 2px">
|
||||
<input type="checkbox" name="nomap" id="nomap" value="1" onclick="switchMap()"> <label for="nomap">Не указывать координаты</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="upl-map">
|
||||
<td class="lcol">Точка съёмки:</td>
|
||||
<td>
|
||||
<div id="map_frame" class="s11 p20" style="display:inline-block; padding:3px">
|
||||
<div id="map_canvas" style="width:600px; height:300px; overflow:hidden"></div>
|
||||
<div>
|
||||
<label for="mapSelector">Выберите карту:</label>
|
||||
<select id="mapSelector">
|
||||
<option value="osm">OpenStreetMap</option>
|
||||
<option value="hot">Humanitarian OpenStreetMap Team</option>
|
||||
<option value="opnv">OPNVKarte</option>
|
||||
<option value="2gis">2ГИС (только Россия)</option>
|
||||
<option value="google">Google Maps</option>
|
||||
</select>
|
||||
<div>
|
||||
<label for="railwayCheckbox">Железная дорога от OpenRailwayMap:</label>
|
||||
<input type="checkbox" id="railwayCheckbox">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</tbody>
|
||||
|
||||
|
||||
</tr>
|
||||
<tr><td colspan="2" style="height:7px"></td></tr><tr>
|
||||
|
||||
</tr></tbody><script>
|
||||
var map = L.map('map_canvas').setView([55.7558, 37.6176], 13);
|
||||
var marker;
|
||||
var geocoder;
|
||||
|
||||
// Инициализация базовых слоев Leaflet.js
|
||||
var baseLayers = {
|
||||
"osm": L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19
|
||||
}),
|
||||
"hot": L.tileLayer('https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19
|
||||
}),
|
||||
"opnv": L.tileLayer('https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: 'Map data © <a href="https://www.thunderforest.com/">Thunderforest</a>'
|
||||
}),
|
||||
"2gis": L.tileLayer('https://tile2.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1', {
|
||||
maxZoom: 19,
|
||||
attribution: '© 2GIS'
|
||||
}),
|
||||
"yandex": L.tileLayer('https://vec0{s}.maps.yandex.net/tiles?l=map&v=4.53.2&z={z}&x={x}&y={y}&scale=1&lang=ru_RU', {
|
||||
subdomains: ['01', '02', '03', '04'],
|
||||
maxZoom: 19
|
||||
}),
|
||||
"yandex-satellite": L.tileLayer('https://sat0{s}.maps.yandex.net/tiles?l=sat&v=3.827.0&z={z}&x={x}&y={y}&scale=1&lang=ru_RU', {
|
||||
subdomains: ['01', '02', '03', '04'],
|
||||
maxZoom: 19
|
||||
}),
|
||||
"google": L.tileLayer('https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}', {
|
||||
subdomains: ['mt0', 'mt1', 'mt2', 'mt3'],
|
||||
maxZoom: 19,
|
||||
attribution: '© Google Maps'
|
||||
}),
|
||||
"openrailway": L.tileLayer('https://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: '© OpenRailwayMap'
|
||||
})
|
||||
};
|
||||
|
||||
document.getElementById('railwayCheckbox').addEventListener('change', function() {
|
||||
if (this.checked) {
|
||||
baseLayers["openrailway"].addTo(map);
|
||||
} else {
|
||||
map.removeLayer(baseLayers["openrailway"]);
|
||||
}
|
||||
});
|
||||
// Инициализация карты Leaflet.js с выбранным базовым слоем по умолчанию
|
||||
baseLayers["osm"].addTo(map);
|
||||
|
||||
// Добавляем элемент управления выбора карты
|
||||
document.getElementById('mapSelector').addEventListener('change', function() {
|
||||
var selectedLayer = this.value;
|
||||
|
||||
// Удаляем текущий слой карты Leaflet.js
|
||||
map.eachLayer(function(layer) {
|
||||
map.removeLayer(layer);
|
||||
});
|
||||
|
||||
// Добавляем выбранный слой карты Leaflet.js
|
||||
baseLayers[selectedLayer].addTo(map);
|
||||
|
||||
// Добавляем разметку внутри зданий для выбранных карт
|
||||
if (selectedLayer === "osm" || selectedLayer === "hot" || selectedLayer === "opnv") {
|
||||
addIndoorLayer(selectedLayer);
|
||||
} else {
|
||||
// Очищаем слой indoor, если выбран другой тип карты
|
||||
clearIndoorLayer();
|
||||
}
|
||||
});
|
||||
|
||||
// Функция добавления слоя разметки внутри зданий (Indoor)
|
||||
function addIndoorLayer(selectedLayer) {
|
||||
// Очищаем предыдущий indoor слой, если он был добавлен
|
||||
clearIndoorLayer();
|
||||
|
||||
// Пример добавления indoor слоя с использованием Leaflet Indoor.js
|
||||
// Ваш код для загрузки и отображения indoor карты
|
||||
// Ниже приведён пример заглушки
|
||||
|
||||
// Создаём новый indoor слой
|
||||
map.indoorLayer = new L.Indoor();
|
||||
|
||||
// Добавляем его на карту
|
||||
map.indoorLayer.addTo(map);
|
||||
|
||||
// Загрузка и отображение indoor карты с помощью Indoor.js
|
||||
// Пример заглушки: добавление одного здания с этажами и метками
|
||||
var building = {
|
||||
name: "Пример здания",
|
||||
floors: [{
|
||||
level: 0,
|
||||
plan: {
|
||||
imageUrl: "path/to/indoor/plan.png", // URL изображения плана здания
|
||||
width: 800, // Ширина изображения в пикселях
|
||||
height: 600 // Высота изображения в пикселях
|
||||
},
|
||||
markers: [{
|
||||
latLng: [51.505, -0.09], // Координаты метки на плане
|
||||
label: "Метка на плане"
|
||||
}]
|
||||
}]
|
||||
};
|
||||
|
||||
// Добавляем здание на indoor слой
|
||||
map.indoorLayer.addLevel(building);
|
||||
|
||||
// Пример настройки интерактивности для меток
|
||||
building.floors.forEach(function(floor) {
|
||||
floor.markers.forEach(function(marker) {
|
||||
var markerIcon = L.divIcon({ className: 'indoor-marker', html: marker.label });
|
||||
L.marker(marker.latLng, { icon: markerIcon }).addTo(map.indoorLayer.getLevel(floor.level));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Функция очистки indoor слоя
|
||||
function clearIndoorLayer() {
|
||||
if (map.indoorLayer) {
|
||||
map.removeLayer(map.indoorLayer);
|
||||
delete map.indoorLayer;
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем обработчик клика на карту Leaflet.js
|
||||
map.on('click', function(e) {
|
||||
if (marker) {
|
||||
map.removeLayer(marker);
|
||||
}
|
||||
|
||||
marker = L.marker(e.latlng).addTo(map);
|
||||
document.getElementById('markerLat').value = e.latlng.lat;
|
||||
document.getElementById('markerLng').value = e.latlng.lng;
|
||||
});
|
||||
|
||||
// Инициализация поискового элемента управления Leaflet.js
|
||||
geocoder = L.Control.geocoder({
|
||||
defaultMarkGeocode: false
|
||||
}).on('markgeocode', function(e) {
|
||||
var latlng = e.geocode.center;
|
||||
|
||||
if (marker) {
|
||||
map.removeLayer(marker);
|
||||
}
|
||||
|
||||
marker = L.marker(latlng).addTo(map);
|
||||
map.setView(latlng, 13);
|
||||
|
||||
document.getElementById('markerLat').value = latlng.lat;
|
||||
document.getElementById('markerLng').value = latlng.lng;
|
||||
|
||||
var bbox = e.geocode.bbox;
|
||||
if (bbox.isValid()) {
|
||||
var poly = L.polygon([
|
||||
bbox.getSouthEast(),
|
||||
bbox.getNorthEast(),
|
||||
bbox.getNorthWest(),
|
||||
bbox.getSouthWest()
|
||||
]).addTo(map);
|
||||
map.fitBounds(poly.getBounds());
|
||||
}
|
||||
}).addTo(map);
|
||||
</script>
|
||||
<tbody class="p20">
|
||||
<tr>
|
||||
<td colspan="2" class="narrow" style="font-size:20px; padding:10px 15px 5px">Шаг 4. <b>Выберите опции загрузки:</b></td>
|
||||
<td colspan="2" id="step4" class="narrow" style="font-size:20px; padding:10px 15px 0">Шаг 3. <b>Отметьте точку, с которой вы делали кадр, на карте:</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
|
||||
|
||||
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
||||
|
||||
|
||||
<td class="lcol">Лицензия:</td>
|
||||
<td style="padding-bottom:7px">
|
||||
<select name="license">
|
||||
<option value="0">Не указана</option>
|
||||
<option value="1" selected>Copyright ©</option>
|
||||
<option value="2">Атрибуция (BY)</option>
|
||||
<option value="3">Атрибуция — С сохранением условий (BY-SA)</option>
|
||||
<option value="4">Атрибуция — Некоммерческое использование (BY-NC)</option>
|
||||
<option value="5">Атрибуция — Некоммерческое использование — С сохранением условий (BY-NC-SA)</option>
|
||||
<option value="6">Атрибуция — Без производных работ (BY-ND)</option>
|
||||
<option value="7">Атрибуция — Некоммерческое использование — Без производных работ (BY-NC-ND)</option>
|
||||
<option value="8">Передача в общественное достояние (Zero)</option>
|
||||
<option value="9">Нет авторских прав (Mark)</option>
|
||||
</select> <a href="https://creativecommons.org/licenses/?lang=ru" target="_blank" class="und sm">Информация о лицензиях</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="padding:20px 2px 12px">
|
||||
<button id="submitbtn" href="#" class="progress-button" data-loading="Идёт загрузка..." data-finished="Обработка..." type="submit">Отправить фотографию</button>
|
||||
<span id="statusbox" class="narrow" style="font-size:20px; font-weight:bold; position:relative; top:-12px"></span>
|
||||
<div id="errorsbox" style="display:none; color:red; margin-top:15px; font-weight:bold;"></div>
|
||||
<td style="padding:7px 2px">
|
||||
<input type="checkbox" name="nomap" id="nomap" value="1" onclick="switchMap()"> <label for="nomap">Не указывать координаты</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="upl-map">
|
||||
<td class="lcol">Точка съёмки:</td>
|
||||
<td>
|
||||
<div id="map_frame" class="s11 p20" style="display:inline-block; padding:3px">
|
||||
<div id="map_canvas" style="width:600px; height:300px; overflow:hidden"></div>
|
||||
<div>
|
||||
<label for="mapSelector">Выберите карту:</label>
|
||||
<select id="mapSelector">
|
||||
<option value="osm">OpenStreetMap</option>
|
||||
<option value="hot">Humanitarian OpenStreetMap Team</option>
|
||||
<option value="opnv">OPNVKarte</option>
|
||||
<option value="2gis">2ГИС (только Россия)</option>
|
||||
<option value="google">Google Maps</option>
|
||||
</select>
|
||||
<div>
|
||||
<label for="railwayCheckbox">Железная дорога от OpenRailwayMap:</label>
|
||||
<input type="checkbox" id="railwayCheckbox">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="lcol">Место съёмки:</td>
|
||||
<td style="padding-right:15px">
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td style="padding:0; vertical-align:middle">
|
||||
<input type="text" name="place" id="place" maxlength="255" style="width:506px" onfocus="showHint('place')" onblur="hideHint('place')" value="">
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</div><br>
|
||||
<div id="loadtable" class="p20" style="display:none; padding-bottom:20px; margin-bottom:15px">
|
||||
<h4>Загруженные фотографии</h4>
|
||||
<div id="loadbox" style="display:flex; flex-wrap:wrap; gap:10px"></div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<script>
|
||||
$('#mform').submit(function(e) {
|
||||
<tr>
|
||||
<td colspan="2" style="height:7px"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
<script>
|
||||
var map = L.map('map_canvas').setView([55.7558, 37.6176], 13);
|
||||
var marker;
|
||||
var geocoder;
|
||||
|
||||
e.preventDefault();
|
||||
var formData = new FormData(this);
|
||||
var bar = $('.bar');
|
||||
var percent = $('.percent');
|
||||
var status = $('#status');
|
||||
var continuepost = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/api/upload',
|
||||
data: formData,
|
||||
|
||||
xhr: function() {
|
||||
// Добавляем спиннер и блокируем кнопку во время загрузки
|
||||
//$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3" disabled><div class="plus-button-reflection"></div>Опубликовать</button>');
|
||||
|
||||
var xhr = new window.XMLHttpRequest();
|
||||
xhr.upload.addEventListener("progress", function(evt) {
|
||||
if (evt.lengthComputable) {
|
||||
var percentComplete = parseInt(((evt.loaded / evt.total) * 100));
|
||||
console.log(evt.total);
|
||||
|
||||
// Обновляем прогресс загрузки
|
||||
scrollProgressBarWidth(percentComplete);
|
||||
}
|
||||
}, false);
|
||||
return xhr;
|
||||
},
|
||||
|
||||
|
||||
|
||||
success: function(response) {
|
||||
try {
|
||||
var jsonData = JSON.parse(response);
|
||||
} catch (err) {
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', escapeHtml(err.message));
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
scrollProgressBarWidth(0);
|
||||
}
|
||||
|
||||
if (jsonData.errorcode == "1") {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'В посте нет контента!');
|
||||
scrollProgressBarWidth(0);
|
||||
|
||||
} else if (jsonData.errorcode == "101") {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'В посте больше 10 медиафайлов');
|
||||
scrollProgressBarWidth(0);
|
||||
}
|
||||
else if (jsonData.errorcode == "0") {
|
||||
Notify.noty('success', 'Успешная публикация!');
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3" disabled>Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
/*let positionData = {
|
||||
id: jsonData.id,
|
||||
user_id: jsonData.user_id,
|
||||
text: jsonData.text,
|
||||
user_flname: jsonData.user_flname,
|
||||
username: jsonData.username,
|
||||
user_photo: jsonData.user_photo
|
||||
// Инициализация базовых слоев Leaflet.js
|
||||
var baseLayers = {
|
||||
"osm": L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19
|
||||
}),
|
||||
"hot": L.tileLayer('https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19
|
||||
}),
|
||||
"opnv": L.tileLayer('https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: 'Map data © <a href="https://www.thunderforest.com/">Thunderforest</a>'
|
||||
}),
|
||||
"2gis": L.tileLayer('https://tile2.maps.2gis.com/tiles?x={x}&y={y}&z={z}&v=1', {
|
||||
maxZoom: 19,
|
||||
attribution: '© 2GIS'
|
||||
}),
|
||||
"yandex": L.tileLayer('https://vec0{s}.maps.yandex.net/tiles?l=map&v=4.53.2&z={z}&x={x}&y={y}&scale=1&lang=ru_RU', {
|
||||
subdomains: ['01', '02', '03', '04'],
|
||||
maxZoom: 19
|
||||
}),
|
||||
"yandex-satellite": L.tileLayer('https://sat0{s}.maps.yandex.net/tiles?l=sat&v=3.827.0&z={z}&x={x}&y={y}&scale=1&lang=ru_RU', {
|
||||
subdomains: ['01', '02', '03', '04'],
|
||||
maxZoom: 19
|
||||
}),
|
||||
"google": L.tileLayer('https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}', {
|
||||
subdomains: ['mt0', 'mt1', 'mt2', 'mt3'],
|
||||
maxZoom: 19,
|
||||
attribution: '© Google Maps'
|
||||
}),
|
||||
"openrailway": L.tileLayer('https://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
attribution: '© OpenRailwayMap'
|
||||
})
|
||||
};
|
||||
|
||||
ws.send(JSON.stringify(positionData));*/
|
||||
setTimeout(function() {
|
||||
window.location.replace("/photo/"+jsonData.id);
|
||||
scrollProgressBarWidth(0);
|
||||
}, 1000);
|
||||
} else if (jsonData.errorcode == "LIMITEXCEEDED") {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
//alert('За последнюю минуту вы отправили слишком много запросов. Повторите попытку позже.');
|
||||
createModal('NONE', 'NONE', 'NONE', 'LIMITEXCEEDED', 'limit');
|
||||
scrollProgressBarWidth(0);
|
||||
} else {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'Неизвестная ошибка');
|
||||
scrollProgressBarWidth(0);
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'Не удалось опубликовать пост');
|
||||
scrollProgressBarWidth(0);
|
||||
},
|
||||
cache: false,
|
||||
contentType: false,
|
||||
processData: false
|
||||
});
|
||||
document.getElementById('railwayCheckbox').addEventListener('change', function() {
|
||||
if (this.checked) {
|
||||
baseLayers["openrailway"].addTo(map);
|
||||
} else {
|
||||
map.removeLayer(baseLayers["openrailway"]);
|
||||
}
|
||||
});
|
||||
// Инициализация карты Leaflet.js с выбранным базовым слоем по умолчанию
|
||||
baseLayers["osm"].addTo(map);
|
||||
|
||||
});
|
||||
// Добавляем элемент управления выбора карты
|
||||
document.getElementById('mapSelector').addEventListener('change', function() {
|
||||
var selectedLayer = this.value;
|
||||
|
||||
// Удаляем текущий слой карты Leaflet.js
|
||||
map.eachLayer(function(layer) {
|
||||
map.removeLayer(layer);
|
||||
});
|
||||
|
||||
// Добавляем выбранный слой карты Leaflet.js
|
||||
baseLayers[selectedLayer].addTo(map);
|
||||
|
||||
// Добавляем разметку внутри зданий для выбранных карт
|
||||
if (selectedLayer === "osm" || selectedLayer === "hot" || selectedLayer === "opnv") {
|
||||
addIndoorLayer(selectedLayer);
|
||||
} else {
|
||||
// Очищаем слой indoor, если выбран другой тип карты
|
||||
clearIndoorLayer();
|
||||
}
|
||||
});
|
||||
|
||||
// Функция добавления слоя разметки внутри зданий (Indoor)
|
||||
function addIndoorLayer(selectedLayer) {
|
||||
// Очищаем предыдущий indoor слой, если он был добавлен
|
||||
clearIndoorLayer();
|
||||
|
||||
// Пример добавления indoor слоя с использованием Leaflet Indoor.js
|
||||
// Ваш код для загрузки и отображения indoor карты
|
||||
// Ниже приведён пример заглушки
|
||||
|
||||
// Создаём новый indoor слой
|
||||
map.indoorLayer = new L.Indoor();
|
||||
|
||||
// Добавляем его на карту
|
||||
map.indoorLayer.addTo(map);
|
||||
|
||||
// Загрузка и отображение indoor карты с помощью Indoor.js
|
||||
// Пример заглушки: добавление одного здания с этажами и метками
|
||||
var building = {
|
||||
name: "Пример здания",
|
||||
floors: [{
|
||||
level: 0,
|
||||
plan: {
|
||||
imageUrl: "path/to/indoor/plan.png", // URL изображения плана здания
|
||||
width: 800, // Ширина изображения в пикселях
|
||||
height: 600 // Высота изображения в пикселях
|
||||
},
|
||||
markers: [{
|
||||
latLng: [51.505, -0.09], // Координаты метки на плане
|
||||
label: "Метка на плане"
|
||||
}]
|
||||
}]
|
||||
};
|
||||
|
||||
// Добавляем здание на indoor слой
|
||||
map.indoorLayer.addLevel(building);
|
||||
|
||||
// Пример настройки интерактивности для меток
|
||||
building.floors.forEach(function(floor) {
|
||||
floor.markers.forEach(function(marker) {
|
||||
var markerIcon = L.divIcon({
|
||||
className: 'indoor-marker',
|
||||
html: marker.label
|
||||
});
|
||||
L.marker(marker.latLng, {
|
||||
icon: markerIcon
|
||||
}).addTo(map.indoorLayer.getLevel(floor.level));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Функция очистки indoor слоя
|
||||
function clearIndoorLayer() {
|
||||
if (map.indoorLayer) {
|
||||
map.removeLayer(map.indoorLayer);
|
||||
delete map.indoorLayer;
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем обработчик клика на карту Leaflet.js
|
||||
map.on('click', function(e) {
|
||||
if (marker) {
|
||||
map.removeLayer(marker);
|
||||
}
|
||||
|
||||
marker = L.marker(e.latlng).addTo(map);
|
||||
document.getElementById('markerLat').value = e.latlng.lat;
|
||||
document.getElementById('markerLng').value = e.latlng.lng;
|
||||
});
|
||||
|
||||
// Инициализация поискового элемента управления Leaflet.js
|
||||
geocoder = L.Control.geocoder({
|
||||
defaultMarkGeocode: false
|
||||
}).on('markgeocode', function(e) {
|
||||
var latlng = e.geocode.center;
|
||||
|
||||
if (marker) {
|
||||
map.removeLayer(marker);
|
||||
}
|
||||
|
||||
marker = L.marker(latlng).addTo(map);
|
||||
map.setView(latlng, 13);
|
||||
|
||||
document.getElementById('markerLat').value = latlng.lat;
|
||||
document.getElementById('markerLng').value = latlng.lng;
|
||||
|
||||
var bbox = e.geocode.bbox;
|
||||
if (bbox.isValid()) {
|
||||
var poly = L.polygon([
|
||||
bbox.getSouthEast(),
|
||||
bbox.getNorthEast(),
|
||||
bbox.getNorthWest(),
|
||||
bbox.getSouthWest()
|
||||
]).addTo(map);
|
||||
map.fitBounds(poly.getBounds());
|
||||
}
|
||||
}).addTo(map);
|
||||
</script>
|
||||
<tbody class="p20">
|
||||
<tr>
|
||||
<td colspan="2" class="narrow" style="font-size:20px; padding:10px 15px 5px">Шаг 4. <b>Выберите опции загрузки:</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
||||
|
||||
|
||||
<td class="lcol">Лицензия:</td>
|
||||
<td style="padding-bottom:7px">
|
||||
<select name="license">
|
||||
<option value="0">Не указана</option>
|
||||
<option value="1" selected>Copyright ©</option>
|
||||
<option value="2">Атрибуция (BY)</option>
|
||||
<option value="3">Атрибуция — С сохранением условий (BY-SA)</option>
|
||||
<option value="4">Атрибуция — Некоммерческое использование (BY-NC)</option>
|
||||
<option value="5">Атрибуция — Некоммерческое использование — С сохранением условий (BY-NC-SA)</option>
|
||||
<option value="6">Атрибуция — Без производных работ (BY-ND)</option>
|
||||
<option value="7">Атрибуция — Некоммерческое использование — Без производных работ (BY-NC-ND)</option>
|
||||
<option value="8">Передача в общественное достояние (Zero)</option>
|
||||
<option value="9">Нет авторских прав (Mark)</option>
|
||||
</select> <a href="https://creativecommons.org/licenses/?lang=ru" target="_blank" class="und sm">Информация о лицензиях</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="padding:20px 2px 12px">
|
||||
<button id="submitbtn" href="#" class="progress-button" data-loading="Идёт загрузка..." data-finished="Обработка..." type="submit">Отправить фотографию</button>
|
||||
<span id="statusbox" class="narrow" style="font-size:20px; font-weight:bold; position:relative; top:-12px"></span>
|
||||
<div id="errorsbox" style="display:none; color:red; margin-top:15px; font-weight:bold;"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</div><br>
|
||||
<div id="loadtable" class="p20" style="display:none; padding-bottom:20px; margin-bottom:15px">
|
||||
<h4>Загруженные фотографии</h4>
|
||||
<div id="loadbox" style="display:flex; flex-wrap:wrap; gap:10px"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<script>
|
||||
$('#mform').submit(function(e) {
|
||||
|
||||
|
||||
e.preventDefault();
|
||||
var formData = new FormData(this);
|
||||
var bar = $('.bar');
|
||||
var percent = $('.percent');
|
||||
var status = $('#status');
|
||||
var continuepost = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/api/upload',
|
||||
data: formData,
|
||||
|
||||
xhr: function() {
|
||||
// Добавляем спиннер и блокируем кнопку во время загрузки
|
||||
//$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3" disabled><div class="plus-button-reflection"></div>Опубликовать</button>');
|
||||
|
||||
var xhr = new window.XMLHttpRequest();
|
||||
xhr.upload.addEventListener("progress", function(evt) {
|
||||
if (evt.lengthComputable) {
|
||||
var percentComplete = parseInt(((evt.loaded / evt.total) * 100));
|
||||
console.log(evt.total);
|
||||
|
||||
// Обновляем прогресс загрузки
|
||||
scrollProgressBarWidth(percentComplete);
|
||||
}
|
||||
}, false);
|
||||
return xhr;
|
||||
},
|
||||
|
||||
|
||||
|
||||
success: function(response) {
|
||||
try {
|
||||
var jsonData = JSON.parse(response);
|
||||
} catch (err) {
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', escapeHtml(err.message));
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
scrollProgressBarWidth(0);
|
||||
}
|
||||
|
||||
if (jsonData.errorcode == "1") {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'В посте нет контента!');
|
||||
scrollProgressBarWidth(0);
|
||||
|
||||
} else if (jsonData.errorcode == "101") {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'В посте больше 10 медиафайлов');
|
||||
scrollProgressBarWidth(0);
|
||||
} else if (jsonData.errorcode == "0") {
|
||||
Notify.noty('success', 'Успешная публикация!');
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3" disabled>Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
//$("#r").html('<button id="uploadbtn" style="margin-right: 15px; background: none; border: none; color: aliceblue; " type="submit" name="createpost" class="mb-3 mt-3"><i style="position:relative; font-size: 25px; margin-right: 10px; color: aliceblue; top: 4px;" class="ti ti-message-share uploadbtn"></i>Опубликовать</button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
/*let positionData = {
|
||||
id: jsonData.id,
|
||||
user_id: jsonData.user_id,
|
||||
text: jsonData.text,
|
||||
user_flname: jsonData.user_flname,
|
||||
username: jsonData.username,
|
||||
user_photo: jsonData.user_photo
|
||||
};
|
||||
|
||||
ws.send(JSON.stringify(positionData));*/
|
||||
setTimeout(function() {
|
||||
window.location.replace("/photo/" + jsonData.id);
|
||||
scrollProgressBarWidth(0);
|
||||
}, 1000);
|
||||
} else if (jsonData.errorcode == "LIMITEXCEEDED") {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
//alert('За последнюю минуту вы отправили слишком много запросов. Повторите попытку позже.');
|
||||
createModal('NONE', 'NONE', 'NONE', 'LIMITEXCEEDED', 'limit');
|
||||
scrollProgressBarWidth(0);
|
||||
} else {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'Неизвестная ошибка');
|
||||
scrollProgressBarWidth(0);
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
$("#r").html('<button type="submit" id="register" name="loginaccount" class="btn btn-block btn-primary py-2 ripple-handler mt-1 mb-3">Опубликовать<span class="ripple-mask"><span class="ripple" style=""></span></span></button>');
|
||||
$("#prgtd").html('');
|
||||
$("#prgrsg").html('');
|
||||
//$("#prgrsg").html('<div id="prgrs" class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" aria-valuenow="0" aria-valuemin="100" aria-valuemax="100" style="width: 100%">100%</div>');
|
||||
Notify.noty('danger', 'Не удалось опубликовать пост');
|
||||
scrollProgressBarWidth(0);
|
||||
},
|
||||
cache: false,
|
||||
contentType: false,
|
||||
processData: false
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
Loading…
Reference in a new issue