-
Шаг 5: Ресурсы для поиска
-
-
-
- updateData({ search_groups: parseInt(e.target.value) })}
- min="0"
- max="100"
- placeholder="Например: 3"
- />
-
-
-
-
- updateData({ search_people: parseInt(e.target.value) })}
- min="0"
- max="1000"
- placeholder="Например: 25"
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default Step5Resources;
diff --git a/frontend/src/components/MapView/MapView.css b/frontend/src/components/MapView/MapView.css
deleted file mode 100644
index dd5bd72..0000000
--- a/frontend/src/components/MapView/MapView.css
+++ /dev/null
@@ -1,146 +0,0 @@
-.map-view-container {
- position: relative;
- width: 100%;
- height: 600px;
- background: #0a0c0f;
- border-radius: 12px;
- overflow: hidden;
- border: 1px solid #21262d;
-}
-
-.map-view {
- width: 100%;
- height: 100%;
-}
-
-.map-controls {
- position: absolute;
- top: 16px;
- right: 16px;
- z-index: 1000;
- display: flex;
- gap: 8px;
-}
-
-.control-btn {
- padding: 10px 16px;
- background: #161b22;
- color: #e6edf3;
- border: 1px solid #30363d;
- border-radius: 6px;
- font-size: 14px;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.2s;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
-}
-
-.control-btn:hover:not(:disabled) {
- background: #21262d;
- border-color: #ff4d00;
-}
-
-.control-btn.active {
- background: #ff4d00;
- color: #ffffff;
- border-color: #ff4d00;
-}
-
-.control-btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
-}
-
-/* ТНП маркер */
-.tnp-marker {
- background: transparent;
- border: none;
-}
-
-.tnp-marker-inner {
- width: 40px;
- height: 40px;
- background: #ff4d00;
- color: #ffffff;
- border: 3px solid #ffffff;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 12px;
- font-weight: 700;
- box-shadow: 0 2px 8px rgba(255, 77, 0, 0.5);
-}
-
-/* Стрелка направления */
-.direction-arrow {
- background: transparent;
- border: none;
-}
-
-.direction-arrow div {
- font-size: 30px;
- color: #ff4d00;
- text-shadow: 0 0 4px rgba(255, 77, 0, 0.8);
-}
-
-/* Leaflet popup стилизация */
-.leaflet-popup-content-wrapper {
- background: #161b22;
- color: #e6edf3;
- border: 1px solid #30363d;
- border-radius: 8px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
-}
-
-.leaflet-popup-content {
- margin: 12px;
- font-size: 13px;
- line-height: 1.5;
-}
-
-.leaflet-popup-content b {
- color: #ff4d00;
- font-size: 14px;
-}
-
-.leaflet-popup-content small {
- color: #8b949e;
- font-size: 11px;
-}
-
-.leaflet-popup-tip {
- background: #161b22;
- border: 1px solid #30363d;
-}
-
-.leaflet-popup-close-button {
- color: #e6edf3 !important;
-}
-
-.leaflet-popup-close-button:hover {
- color: #ff4d00 !important;
-}
-
-/* Адаптивность */
-@media (max-width: 768px) {
- .map-view-container {
- height: 400px;
- }
-
- .map-controls {
- top: 8px;
- right: 8px;
- }
-
- .control-btn {
- padding: 8px 12px;
- font-size: 12px;
- }
-
- .tnp-marker-inner {
- width: 32px;
- height: 32px;
- font-size: 10px;
- }
-}
diff --git a/frontend/src/components/MapView/MapView.jsx b/frontend/src/components/MapView/MapView.jsx
deleted file mode 100644
index a565e40..0000000
--- a/frontend/src/components/MapView/MapView.jsx
+++ /dev/null
@@ -1,273 +0,0 @@
-import React, { useEffect, useRef, useState } from "react";
-import L from "leaflet";
-import "leaflet/dist/leaflet.css";
-import "leaflet.heat";
-import "./MapView.css";
-
-// Fix Leaflet default marker icons
-delete L.Icon.Default.prototype._getIconUrl;
-L.Icon.Default.mergeOptions({
- iconRetinaUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png",
- iconUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",
- shadowUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png",
-});
-
-const MapView = ({
- tnpLat,
- tnpLon,
- zones = [],
- direction = null,
- heatmapData = [],
- showHeatmap = false
-}) => {
- const mapRef = useRef(null);
- const mapInstanceRef = useRef(null);
- const zonesLayerRef = useRef(null);
- const heatmapLayerRef = useRef(null);
- const tnpMarkerRef = useRef(null);
- const directionArrowRef = useRef(null);
-
- const [heatmapVisible, setHeatmapVisible] = useState(showHeatmap);
-
- // Цвета зон из §5 ЦОУ палитры
- const ZONE_COLORS = {
- 0: "#ff4d00", // Зона 1 (0-500м) - красный
- 1: "#ff9f1a", // Зона 2 (500-1500м) - оранжевый
- 2: "#ffd166", // Зона 3 (1500-2500м) - желтый
- };
-
- // Направления в градусы
- const DIRECTION_ANGLES = {
- N: 0,
- NE: 45,
- E: 90,
- SE: 135,
- S: 180,
- SW: 225,
- W: 270,
- NW: 315,
- };
-
- useEffect(() => {
- if (!mapRef.current || mapInstanceRef.current) return;
-
- // Инициализация карты
- const map = L.map(mapRef.current).setView([tnpLat || 53.9, tnpLon || 27.56], 13);
-
- L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
- attribution: "© OpenStreetMap contributors",
- maxZoom: 19,
- }).addTo(map);
-
- mapInstanceRef.current = map;
-
- return () => {
- if (mapInstanceRef.current) {
- mapInstanceRef.current.remove();
- mapInstanceRef.current = null;
- }
- };
- }, []);
-
- // Обновление ТНП маркера
- useEffect(() => {
- if (!mapInstanceRef.current || !tnpLat || !tnpLon) return;
-
- // Удаляем старый маркер
- if (tnpMarkerRef.current) {
- mapInstanceRef.current.removeLayer(tnpMarkerRef.current);
- }
-
- // Создаем красный маркер ТНП
- const tnpIcon = L.divIcon({
- className: "tnp-marker",
- html: "
-
Карточка пропавшего
-
- {/* Базовая информация */}
-
- Основная информация
-
-
-
- setFormData({...formData, age: e.target.value})}
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- setFormData({...formData, physical_condition: e.target.value})}
- />
-
-
-
- {/* Обстоятельства пропажи */}
-
- Обстоятельства пропажи
-
-
-
-
-
-
-
-
-
-
-
-
-
- setFormData({...formData, time_missing: e.target.value})}
- />
-
-
-
-
- setFormData({...formData, last_location: e.target.value})}
- />
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Диагнозы */}
-
-
- {/* Блок психотипа */}
-
-
-
Поведение ребёнка (спросить родителей)
-
Помогает уточнить зону поиска
-
-
- {/* Вопрос 1: Незнакомая обстановка */}
-
-
-
-
-
-
-
-
-
-
- {/* Вопрос 2: Реакция на неудачи */}
-
-
-
-
-
-
-
-
-
- {/* Вопрос 3: Лидер или ведомый */}
-
-
-
-
-
-
-
-
-
- {/* Вопрос 4: Любит рисковать */}
-
-
-
-
-
-
-
-
-
-
- {/* Кнопка отправки */}
-
-
- );
-};
-
-export default MobileForm;
diff --git a/frontend/src/components/MobileForm.tsx b/frontend/src/components/MobileForm.tsx
deleted file mode 100644
index 3ac3d42..0000000
--- a/frontend/src/components/MobileForm.tsx
+++ /dev/null
@@ -1,296 +0,0 @@
-import React, { useState } from 'react';
-import axios from 'axios';
-import './MobileForm.css';
-
-interface PsychotypeAnswers {
- unfamiliar_env?: string;
- stress_reaction?: string;
- group_role?: string;
- risk_taking?: string;
-}
-
-interface FormData {
- age?: number;
- gender?: string;
- diagnosis_type?: string[];
- psychotype_answers?: PsychotypeAnswers;
-}
-
-const MobileForm: React.FC = () => {
- const [formData, setFormData] = useState