diff --git a/dbapp/mainapp/templates/mainapp/multi_sources_playback_map.html b/dbapp/mainapp/templates/mainapp/multi_sources_playback_map.html
new file mode 100644
index 0000000..0f1ff07
--- /dev/null
+++ b/dbapp/mainapp/templates/mainapp/multi_sources_playback_map.html
@@ -0,0 +1,676 @@
+{% extends "mainapp/base.html" %}
+{% load static %}
+{% block title %}Анимация движения объектов{% endblock title %}
+
+{% block extra_css %}
+
+
+
+{% endblock %}
+
+{% block content %}
+
+
+ Загрузка...
+
+
Загрузка данных...
+
+
+
+
+
+
+
+
+
+
--
+
+
+
+
+
+{% endblock content %}
+
+{% block extra_js %}
+
+
+
+
+{% endblock extra_js %}
diff --git a/dbapp/mainapp/templates/mainapp/source_list.html b/dbapp/mainapp/templates/mainapp/source_list.html
index 255af54..401db58 100644
--- a/dbapp/mainapp/templates/mainapp/source_list.html
+++ b/dbapp/mainapp/templates/mainapp/source_list.html
@@ -1435,6 +1435,26 @@ function showSelectedSourcesOnMap() {
window.open(url, '_blank');
}
+// Function to show playback animation for selected sources
+function showPlaybackAnimation() {
+ if (!window.selectedSources || window.selectedSources.length === 0) {
+ alert('Список источников пуст');
+ return;
+ }
+
+ // Check if any source has points
+ const sourcesWithPoints = window.selectedSources.filter(source => parseInt(source.objitem_count) > 0);
+ if (sourcesWithPoints.length === 0) {
+ alert('Выбранные источники не содержат точек ГЛ');
+ return;
+ }
+
+ const selectedIds = window.selectedSources.map(source => source.id);
+ const url = '{% url "mainapp:multi_sources_playback_map" %}' + '?ids=' + selectedIds.join(',');
+
+ window.open(url, '_blank');
+}
+
// Function to merge selected sources
function mergeSelectedSources() {
if (!window.selectedSources || window.selectedSources.length < 2) {
@@ -2065,6 +2085,9 @@ function showTransponderModal(transponderId) {
+
{% if user.customuser.role == 'admin' or user.customuser.role == 'moderator' %}
-
-