Доделал страницу с Кубсатами
This commit is contained in:
@@ -37,11 +37,11 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'mainapp:kubsat' %}">Кубсат</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<!-- <li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'mapsapp:3dmap' %}">3D карта</a>
|
||||
</li>
|
||||
</li> -->
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'mapsapp:2dmap' %}">2D карта</a>
|
||||
<a class="nav-link" href="{% url 'mapsapp:2dmap' %}">Карта</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'admin:index' %}">Админ панель</a>
|
||||
|
||||
@@ -23,6 +23,12 @@
|
||||
<!-- Спутники -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="{{ form.satellites.id_for_label }}" class="form-label">{{ form.satellites.label }}</label>
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('satellites', true)">Выбрать</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('satellites', false)">Снять</button>
|
||||
</div>
|
||||
{{ form.satellites }}
|
||||
<small class="form-text text-muted">Удерживайте Ctrl для выбора нескольких</small>
|
||||
</div>
|
||||
@@ -30,19 +36,40 @@
|
||||
<!-- Полоса спутника -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="{{ form.band.id_for_label }}" class="form-label">{{ form.band.label }}</label>
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('band', true)">Выбрать</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('band', false)">Снять</button>
|
||||
</div>
|
||||
{{ form.band }}
|
||||
<small class="form-text text-muted">Удерживайте Ctrl для выбора нескольких</small>
|
||||
</div>
|
||||
|
||||
<!-- Поляризация -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="{{ form.polarization.id_for_label }}" class="form-label">{{ form.polarization.label }}</label>
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('polarization', true)">Выбрать</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('polarization', false)">Снять</button>
|
||||
</div>
|
||||
{{ form.polarization }}
|
||||
<small class="form-text text-muted">Удерживайте Ctrl для выбора нескольких</small>
|
||||
</div>
|
||||
|
||||
<!-- Модуляция -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="{{ form.modulation.id_for_label }}" class="form-label">{{ form.modulation.label }}</label>
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('modulation', true)">Выбрать</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('modulation', false)">Снять</button>
|
||||
</div>
|
||||
{{ form.modulation }}
|
||||
<small class="form-text text-muted">Удерживайте Ctrl для выбора нескольких</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -70,12 +97,19 @@
|
||||
<!-- Тип объекта -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="{{ form.object_type.id_for_label }}" class="form-label">{{ form.object_type.label }}</label>
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('object_type', true)">Выбрать</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||
onclick="selectAllOptions('object_type', false)">Снять</button>
|
||||
</div>
|
||||
{{ form.object_type }}
|
||||
<small class="form-text text-muted">Удерживайте Ctrl для выбора нескольких</small>
|
||||
</div>
|
||||
|
||||
<!-- Принадлежность объекта (заглушка) -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="{{ form.object_ownership.id_for_label }}" class="form-label">{{ form.object_ownership.label }} <span class="badge bg-secondary">Заглушка</span></label>
|
||||
<label for="{{ form.object_ownership.id_for_label }}" class="form-label">{{ form.object_ownership.label }} (не работает)</label>
|
||||
{{ form.object_ownership }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -98,7 +132,7 @@
|
||||
|
||||
<!-- Планы на (фиктивный) -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label">{{ form.has_plans.label }} <span class="badge bg-secondary">Фиктивный</span></label>
|
||||
<label class="form-label">{{ form.has_plans.label }} (не работает)</label>
|
||||
<div>
|
||||
{% for radio in form.has_plans %}
|
||||
<div class="form-check">
|
||||
@@ -113,7 +147,7 @@
|
||||
|
||||
<!-- Успех 1 (фиктивный) -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label">{{ form.success_1.label }} <span class="badge bg-secondary">Фиктивный</span></label>
|
||||
<label class="form-label">{{ form.success_1.label }} (не рабльает)</label>
|
||||
<div>
|
||||
{% for radio in form.success_1 %}
|
||||
<div class="form-check">
|
||||
@@ -128,7 +162,7 @@
|
||||
|
||||
<!-- Успех 2 (фиктивный) -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label">{{ form.success_2.label }} <span class="badge bg-secondary">Фиктивный</span></label>
|
||||
<label class="form-label">{{ form.success_2.label }} (не работает)</label>
|
||||
<div>
|
||||
{% for radio in form.success_2 %}
|
||||
<div class="form-check">
|
||||
@@ -145,7 +179,7 @@
|
||||
<div class="row">
|
||||
<!-- Диапазон дат (фиктивный) -->
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Диапазон дат <span class="badge bg-secondary">Фиктивный</span></label>
|
||||
<label class="form-label">Диапазон дат ГЛ:</label>
|
||||
<div class="input-group">
|
||||
{{ form.date_from }}
|
||||
<span class="input-group-text">—</span>
|
||||
@@ -164,7 +198,7 @@
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Кнопки экспорта и фильтрации -->
|
||||
<!-- Кнопка экспорта и статистика -->
|
||||
{% if sources_with_date_info %}
|
||||
<div class="row mb-3">
|
||||
<div class="col-12">
|
||||
@@ -174,10 +208,10 @@
|
||||
<button type="button" class="btn btn-success" onclick="exportToExcel()">
|
||||
<i class="bi bi-file-earmark-excel"></i> Экспорт в Excel
|
||||
</button>
|
||||
<button type="button" class="btn btn-warning" onclick="filterByDateMatch()">
|
||||
<i class="bi bi-funnel"></i> Оставить только подходящие по дате
|
||||
</button>
|
||||
<span class="ms-auto text-muted"></span>
|
||||
<span class="text-muted" id="statsCounter">
|
||||
Найдено объектов: {{ sources_with_date_info|length }},
|
||||
точек: {% for source_data in sources_with_date_info %}{{ source_data.objitems_data|length }}{% if not forloop.last %}+{% endif %}{% endfor %}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -195,7 +229,7 @@
|
||||
<table class="table table-striped table-hover table-sm table-bordered" style="font-size: 0.85rem;" id="resultsTable">
|
||||
<thead class="table-dark sticky-top">
|
||||
<tr>
|
||||
<th style="min-width: 80px;">ID Source</th>
|
||||
<th style="min-width: 80px;">ID объекта</th>
|
||||
<th style="min-width: 120px;">Тип объекта</th>
|
||||
<th class="text-center" style="min-width: 100px;">Кол-во точек</th>
|
||||
<th style="min-width: 120px;">Имя точки</th>
|
||||
@@ -214,7 +248,6 @@
|
||||
{% for objitem_data in source_data.objitems_data %}
|
||||
<tr data-source-id="{{ source_data.source.id }}"
|
||||
data-objitem-id="{{ objitem_data.objitem.id }}"
|
||||
class="{% if objitem_data.matches_date %}table-success{% endif %}"
|
||||
data-matches-date="{{ objitem_data.matches_date|yesno:'true,false' }}"
|
||||
data-is-first-in-source="{% if forloop.first %}true{% else %}false{% endif %}">
|
||||
|
||||
@@ -251,7 +284,7 @@
|
||||
<!-- Частота -->
|
||||
<td>
|
||||
{% if objitem_data.objitem.parameter_obj %}
|
||||
{{ objitem_data.objitem.parameter_obj.frequency|default:"-" }}
|
||||
{{ objitem_data.objitem.parameter_obj.frequency|default:"-"|floatformat:3 }}
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
@@ -260,7 +293,7 @@
|
||||
<!-- Полоса -->
|
||||
<td>
|
||||
{% if objitem_data.objitem.parameter_obj %}
|
||||
{{ objitem_data.objitem.parameter_obj.freq_range|default:"-" }}
|
||||
{{ objitem_data.objitem.parameter_obj.freq_range|default:"-"|floatformat:3 }}
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
@@ -287,7 +320,7 @@
|
||||
<!-- Координаты ГЛ -->
|
||||
<td>
|
||||
{% if objitem_data.objitem.geo_obj and objitem_data.objitem.geo_obj.coords %}
|
||||
{{ objitem_data.objitem.geo_obj.coords.y|floatformat:6 }}, {{ objitem_data.objitem.geo_obj.coords.x|floatformat:6 }}
|
||||
{{ objitem_data.objitem.geo_obj.coords.y }}, {{ objitem_data.objitem.geo_obj.coords.x }}
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
@@ -439,70 +472,18 @@ function removeSource(button) {
|
||||
|
||||
function updateCounter() {
|
||||
const rows = document.querySelectorAll('#resultsTable tbody tr');
|
||||
const counter = document.querySelector('.text-muted');
|
||||
const counter = document.getElementById('statsCounter');
|
||||
if (counter) {
|
||||
// Подсчитываем уникальные источники
|
||||
const uniqueSources = new Set();
|
||||
let matchingCount = 0;
|
||||
rows.forEach(row => {
|
||||
uniqueSources.add(row.dataset.sourceId);
|
||||
if (row.dataset.matchesDate === 'true') {
|
||||
matchingCount++;
|
||||
}
|
||||
});
|
||||
counter.textContent = `Найдено объектов: ${uniqueSources.size}, точек: ${rows.length} (подходящих по дате: ${matchingCount})`;
|
||||
counter.textContent = `Найдено объектов: ${uniqueSources.size}, точек: ${rows.length}`;
|
||||
}
|
||||
}
|
||||
|
||||
function filterByDateMatch() {
|
||||
// Удаляем все строки, которые не подходят по дате
|
||||
const rows = Array.from(document.querySelectorAll('#resultsTable tbody tr'));
|
||||
const rowsToRemove = rows.filter(row => row.dataset.matchesDate !== 'true');
|
||||
|
||||
if (rowsToRemove.length === 0) {
|
||||
alert('Все точки уже подходят по дате или фильтр по дате не задан');
|
||||
return;
|
||||
}
|
||||
|
||||
if (confirm(`Удалить ${rowsToRemove.length} точек, не подходящих по дате?`)) {
|
||||
// Группируем строки по источникам
|
||||
const sourceGroups = {};
|
||||
rows.forEach(row => {
|
||||
const sourceId = row.dataset.sourceId;
|
||||
if (!sourceGroups[sourceId]) {
|
||||
sourceGroups[sourceId] = [];
|
||||
}
|
||||
sourceGroups[sourceId].push(row);
|
||||
});
|
||||
|
||||
// Обрабатываем каждый источник отдельно
|
||||
Object.keys(sourceGroups).forEach(sourceId => {
|
||||
const sourceRows = sourceGroups[sourceId];
|
||||
const rowsToKeep = sourceRows.filter(row => row.dataset.matchesDate === 'true');
|
||||
const rowsToDelete = sourceRows.filter(row => row.dataset.matchesDate !== 'true');
|
||||
|
||||
if (rowsToDelete.length === 0) {
|
||||
return; // Все строки подходят
|
||||
}
|
||||
|
||||
if (rowsToKeep.length === 0) {
|
||||
// Удаляем все строки источника
|
||||
rowsToDelete.forEach(row => row.remove());
|
||||
} else {
|
||||
// Есть строки для сохранения
|
||||
// Удаляем строки по одной, используя функцию removeObjItem
|
||||
rowsToDelete.forEach(row => {
|
||||
const button = row.querySelector('button[onclick*="removeObjItem"]');
|
||||
if (button) {
|
||||
removeObjItem(button);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
updateCounter();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function exportToExcel() {
|
||||
// Собираем ID оставшихся в таблице точек (ObjItem)
|
||||
@@ -544,6 +525,16 @@ function exportToExcel() {
|
||||
document.body.removeChild(form);
|
||||
}
|
||||
|
||||
// Функция для выбора/снятия всех опций в select
|
||||
function selectAllOptions(selectName, selectAll) {
|
||||
const selectElement = document.querySelector(`select[name="${selectName}"]`);
|
||||
if (selectElement) {
|
||||
for (let i = 0; i < selectElement.options.length; i++) {
|
||||
selectElement.options[i].selected = selectAll;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Обновляем счетчик при загрузке страницы
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
updateCounter();
|
||||
@@ -563,10 +554,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
/* Выделение строк, подходящих по дате */
|
||||
.table-success {
|
||||
background-color: #d1e7dd !important;
|
||||
}
|
||||
|
||||
|
||||
/* Стили для кнопок действий */
|
||||
.btn-sm {
|
||||
|
||||
Reference in New Issue
Block a user