обновление бизнес логики

This commit is contained in:
2026-02-05 21:23:20 +03:00
parent 44473a8d9d
commit 6caf1c9dbb
10 changed files with 111 additions and 2119 deletions

View File

@@ -21,6 +21,8 @@ interface SceneToolbarProps {
onSelectModel?: (modelPath: string) => void;
panActive?: boolean;
navMenuActive?: boolean;
onToggleSensorHighlights?: () => void;
sensorHighlightsActive?: boolean;
}
const SceneToolbar: React.FC<SceneToolbarProps> = ({
@@ -31,6 +33,8 @@ const SceneToolbar: React.FC<SceneToolbarProps> = ({
onSelectModel,
panActive = false,
navMenuActive = false,
onToggleSensorHighlights,
sensorHighlightsActive = true,
}) => {
const [isZoomOpen, setIsZoomOpen] = useState(false);
const { showMonitoring, openMonitoring, closeMonitoring, currentZones, loadZones, currentObject } = useNavigationStore();
@@ -43,88 +47,45 @@ const SceneToolbar: React.FC<SceneToolbarProps> = ({
}
};
const handleHomeClick = async () => {
if (!onSelectModel) return;
try {
let zones: Zone[] = Array.isArray(currentZones) ? currentZones : [];
// Если зоны ещё не загружены, откройте Monitoring и загрузите зоны для текущего объекта
if ((!zones || zones.length === 0) && currentObject?.id) {
if (!showMonitoring) {
openMonitoring();
}
await loadZones(currentObject.id);
zones = useNavigationStore.getState().currentZones || [];
}
if (!Array.isArray(zones) || zones.length === 0) {
console.warn('No zones available to select a model from.');
return;
}
const sorted = zones.slice().sort((a: Zone, b: Zone) => {
const oa = typeof a.order === 'number' ? a.order : 0;
const ob = typeof b.order === 'number' ? b.order : 0;
if (oa !== ob) return oa - ob;
return (a.name || '').localeCompare(b.name || '');
});
const top = sorted[0];
let chosenPath: string | null = top?.model_path && String(top.model_path).trim() ? top.model_path! : null;
if (!chosenPath) {
const nextWithModel = sorted.find((z) => z.model_path && String(z.model_path).trim());
chosenPath = nextWithModel?.model_path ?? null;
}
if (chosenPath) {
onSelectModel(chosenPath);
} else {
console.warn('No zone has a valid model_path to open.');
}
} catch (error) {
console.error('Error selecting top zone model:', error);
}
};
const defaultButtons: ToolbarButton[] = [
{
icon: '/icons/Zoom.png',
label: 'Zoom',
label: 'Масштаб',
onClick: () => setIsZoomOpen(!isZoomOpen),
active: isZoomOpen,
children: [
{
icon: '/icons/plus.svg',
label: 'Zoom In',
label: 'Приблизить',
onClick: onZoomIn || (() => {}),
},
{
icon: '/icons/minus.svg',
label: 'Zoom Out',
label: 'Отдалить',
onClick: onZoomOut || (() => {}),
},
]
},
{
icon: '/icons/Video.png',
label: "Top View",
label: 'Вид сверху',
onClick: onTopView || (() => console.log('Top View')),
},
{
icon: '/icons/Pointer.png',
label: 'Pan',
label: 'Панорамирование',
onClick: onPan || (() => console.log('Pan')),
active: panActive,
},
{
icon: '/icons/Warehouse.png',
label: 'Home',
onClick: handleHomeClick,
icon: '/icons/Eye.png',
label: 'Подсветка датчиков',
onClick: onToggleSensorHighlights || (() => console.log('Toggle Sensor Highlights')),
active: sensorHighlightsActive,
},
{
icon: '/icons/Layers.png',
label: 'Levels',
label: 'Общий вид',
onClick: handleToggleNavMenu,
active: navMenuActive,
},