153 lines
5.9 KiB
JavaScript
153 lines
5.9 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
|
||
Компонент панели: Раздел настройки
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||
import { Box } from "@mui/material"; //Интерфейсные элементы
|
||
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||
import { useConfSectionMarks } from "../hooks"; //Кастомные хуки
|
||
import { ActionMessage } from "./action_message"; //Сообщение с действиями
|
||
import { Marks } from "./marks"; //Показатели раздела
|
||
|
||
//---------
|
||
//Константы
|
||
//---------
|
||
|
||
//Стили
|
||
const STYLES = {
|
||
CONTAINER: { width: "100%", height: "100%" },
|
||
BOX_MARKS: { position: "relative", display: "flex", height: "100%", width: "100%" }
|
||
};
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Раздел настройки
|
||
const Section = ({ section = null }) => {
|
||
//Состояние сортировки строк и граф
|
||
const [order, setOrder] = useState({ rowOrder: 0, columnOrder: 0 });
|
||
|
||
//Состояние - флаг "сокрытия" (на самом деле - отмонтирования) компонента с показателями
|
||
const [hideMarksThenLoading, setHideMarksThenLoading] = useState(false);
|
||
|
||
//Данные раздела (показатели)
|
||
const [marks, refreshMarks, marksLoading, marksInit] = useConfSectionMarks(section, order.rowOrder, order.columnOrder);
|
||
|
||
//Подключение к контексту взаимодействия с сервером
|
||
const { executeStored } = useContext(BackEndСtx);
|
||
|
||
//Добавление показателя
|
||
const insertMark = async ({ code, name, row, rowCode, rowVersion, column, columnCode, columnVersion }, cb) => {
|
||
try {
|
||
await executeStored({
|
||
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_INSERT",
|
||
args: {
|
||
NPRN: section,
|
||
SCODE: code,
|
||
SNAME: name,
|
||
NRRPROW: row,
|
||
SRRPROW: rowCode,
|
||
SRRPVERSION_ROW: rowVersion,
|
||
NRRPCOLUMN: column,
|
||
SRRPCOLUMN: columnCode,
|
||
SRRPVERSION_COLUMN: columnVersion
|
||
},
|
||
loader: false
|
||
});
|
||
cb && cb(true);
|
||
refreshMarks();
|
||
} catch {
|
||
cb && cb(false);
|
||
}
|
||
};
|
||
|
||
//Исправление показателя
|
||
const updateMark = async ({ rn, code, name, rowCode, rowVersion, columnCode, columnVersion }, cb) => {
|
||
try {
|
||
await executeStored({
|
||
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_UPDATE",
|
||
args: {
|
||
NRN: rn,
|
||
SCODE: code,
|
||
SNAME: name,
|
||
SRRPROW: rowCode,
|
||
SRRPVERSION_ROW: rowVersion,
|
||
SRRPCOLUMN: columnCode,
|
||
SRRPVERSION_COLUMN: columnVersion
|
||
},
|
||
loader: false
|
||
});
|
||
cb && cb(true);
|
||
refreshMarks();
|
||
} catch {
|
||
cb && cb(false);
|
||
}
|
||
};
|
||
|
||
//Удаление показателя
|
||
const deleteMark = async mark => {
|
||
await executeStored({
|
||
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_DELETE",
|
||
args: { NRN: mark },
|
||
loader: false
|
||
});
|
||
refreshMarks();
|
||
};
|
||
|
||
//Изменение сортировки
|
||
const changeOrder = order => setOrder(order);
|
||
|
||
//Сброс ранее выставленного флага "сокрытия" (отмонтирования) компонента с показателями (так он не "мигает", когда происходит не смена раздела, в работа внутри него с показателями)
|
||
useEffect(() => {
|
||
if (hideMarksThenLoading) setHideMarksThenLoading(false);
|
||
}, [hideMarksThenLoading]);
|
||
|
||
//При смене раздела - выставим флаг "спрятать" (отмонтировать) компонент с показателями (так он корректно полностью обновляется)
|
||
useEffect(() => {
|
||
if (section) setHideMarksThenLoading(true);
|
||
}, [section]);
|
||
|
||
//Формирование представления
|
||
return (
|
||
<Box sx={STYLES.CONTAINER}>
|
||
{section ? (
|
||
<Box sx={STYLES.BOX_MARKS}>
|
||
{((hideMarksThenLoading && !marksLoading) || !hideMarksThenLoading) && (
|
||
<Marks
|
||
marks={marks}
|
||
order={order}
|
||
marksLoading={marksLoading}
|
||
marksInit={marksInit}
|
||
onRefresh={refreshMarks}
|
||
onMarkInsert={insertMark}
|
||
onMarkUpdate={updateMark}
|
||
onMarkDelete={deleteMark}
|
||
onOrderChange={changeOrder}
|
||
/>
|
||
)}
|
||
</Box>
|
||
) : (
|
||
<ActionMessage icon={"info"} title={"Раздел настройки не выбран"} desc={"Укажите его, выбрав закладку сверху"} />
|
||
)}
|
||
</Box>
|
||
);
|
||
};
|
||
|
||
//Контроль свойств - Раздел настройки
|
||
Section.propTypes = {
|
||
section: PropTypes.number
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
export { Section };
|