153 lines
5.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Парус 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 };