/*
Парус 8 - Панели мониторинга - Редактор панелей
Корневой компонент
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useState, useContext, useEffect } from "react"; //Классы React
import { Box, Icon, Fab } from "@mui/material"; //Интерфейсные элементы
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { PanelsManager } from "./components/panels_manager/panels_manager"; //Менеджер панелей
import { usePanel } from "./components/components_hooks"; //Вспомогательные хуки
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
import { PanelEditor } from "./panel_editor"; //Редактор панели
//---------
//Константы
//---------
//Заголовок панели по умолчанию
const APP_BAR_TITLE_DEFAULT = "Редактор панелей";
//Стили
const STYLES = {
BOX_PLAY_MODE: {
position: "absolute",
top: 12,
right: 15,
zIndex: 2000,
display: "flex",
height: "42px",
width: "145px",
justifyContent: "flex-end",
gap: "10px"
}
};
//-----------
//Тело модуля
//-----------
//Корневой компонент редактора панелей
const PanelsEditor = () => {
//Собственное состояние - иниализация панели
const [init, setInit] = useState(true);
//Собственное состояние - иниализируемая панель
const [panel, panelName, editMode, isEditAvaliable, isPanelChanged, loadPanel, selectPanel, closePanel, changeEditMode, setPanelChanged] =
usePanel();
//Отображения менеджера панелей
const [openPanelsManager, setOpenPanelsManager] = useState(false);
//Отображение параметров панели
const [openPanelVariables, setOpenPanelVariables] = useState(false);
//Подключение к контексту навигации
const { getNavigationSearch } = useContext(NavigationCtx);
//Подключение к контексту сообщений
const { showMsgWarn } = useContext(MessagingСtx);
//Подключение к контексту приложения
const { setAppBarTitle } = useContext(ApplicationСtx);
//При выборе панели
const handlePanelSelect = panel => {
//Если панель выбрана и есть изменения
if (panel && isPanelChanged)
showMsgWarn(
`Панель содержит несохраненные изменения. Закрыть панель без изменений?`,
() => {
selectPanel(panel.rn, panel.name, panel.modify === 1 ? true : false);
setOpenPanelsManager(false);
},
() => setOpenPanelsManager(false)
);
else {
selectPanel(panel.rn, panel.name, panel.modify === 1 ? true : false);
setOpenPanelsManager(false);
}
};
//Закрытие панели
const handlePanelClose = () => {
//Если панель выбрана и есть изменения
if (panel && isPanelChanged)
showMsgWarn(`Панель содержит несохраненные изменения. Закрыть панель без изменений?`, () => {
closePanel();
setOpenPanelsManager(true);
});
else {
closePanel();
setOpenPanelsManager(true);
}
};
//Открытие менеджера панелей
const handleOpenPanelsManager = () => setOpenPanelsManager(true);
//Закрытие менеджера панелей
const handleCancelPanelsManager = () => setOpenPanelsManager(false);
//Открытие/закрытие параметров панели
const handleToggleOpenPanelVariables = () => setOpenPanelVariables(!openPanelVariables);
//Включение/выключение режима редактирования
const handleToggleEditMode = () => {
//Включаем/отключаем панель
changeEditMode(!editMode);
//Изначально отключаем отображение параметров панели
setOpenPanelVariables(false);
};
//Дополнительные кнопки режима использования панели
const runTimeButtons = !editMode && (
{isEditAvaliable ? (
edit
) : null}
file_open
mediation
);
//При открытии панели
useEffect(() => {
//Считаем параметры открытия панели
const panelPrms = getNavigationSearch();
//Если указан рег. номер панели - устанавливаем изначальный рег. номер панели
if (panelPrms.SCODE) loadPanel(panelPrms.SCODE);
//Если рег. номера панели нет - открываем менеджер панелей
else handleOpenPanelsManager();
//Указываем, что инициализация пройдена
setInit(false);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
//При изменении мнемокода панели
useEffect(() => {
//Устанавливаем заголовок в шапке приложения
setAppBarTitle(panelName ? `Панель [${panelName}]` : APP_BAR_TITLE_DEFAULT);
}, [panelName, setAppBarTitle]);
//Генерация содержимого
return (
<>
{!init ? (
<>
{runTimeButtons}
{openPanelsManager && (
)}
{panel && (
)}
>
) : null}
>
);
};
//----------------
//Интерфейс модуля
//----------------
export { PanelsEditor };