/*
Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
Компонент панели: Показатели раздела
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useState, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Icon, Button } from "@mui/material"; //Интерфейсные элементы
import { MessagingСtx } from "../../../context/messaging"; //Контекст сообщений
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { APP_STYLES } from "../../../../app.styles"; //Типовые стили
import { confSctnMrkCellRender, confSctnMrkHeadCellRender } from "../layouts"; //Дополнительная разметка и вёрстка клиентских элементов
import { ActionMessage } from "./action_message"; //Сообщение с действиями
import { DialogMarkIU } from "./dialog_mark_iu"; //Диалог добавления/исправления показателя
import { DialogHelp } from "./dialog_help"; //Диалог помощи
import { DialogOrder } from "./dialog_order"; //Диалог сортировки
import { useDictionary } from "../hooks"; //Кастомные хуки
//---------
//Константы
//---------
//Стили
const STYLES = {
MARKS_DG_CONTAINER: {
position: "absolute",
top: 0,
bottom: 0,
width: "100%",
height: "100%",
overflow: "auto",
border: "unset",
...APP_STYLES.SCROLL
},
MARKS_DG_TABLE: { tableLayout: "fixed", width: "auto" }
};
//-----------
//Тело модуля
//-----------
//Показатели раздела
const Marks = ({ marks, order, marksLoading, marksInit, onRefresh, onMarkInsert, onMarkUpdate, onMarkDelete, onOrderChange }) => {
//Состояние - диалог сортировки
const [dialogOrder, setDialogOrder] = useState(false);
//Состояние - диалог помощи
const [dialogHelp, setDialogHelp] = useState(false);
//Состояние - Редактируемый показатель
const [modMark, setModMark] = useState(null);
//Подключение к контексту сообщений
const { showMsgWarn } = useContext(MessagingСtx);
//Подключение к словарям
const { showMark, showMarkCn, showMarkCnAdd } = useDictionary();
//Изменение состояния диалога информации
const toggleHelpDialog = () => setDialogHelp(pv => !pv);
//Изменение состояния диалога сортировки
const toggleOrderDialog = () => setDialogOrder(pv => !pv);
//При необходимости обновления
const handleRefresh = () => onRefresh && onRefresh();
//При вызове сортировки
const handleOrder = () => toggleOrderDialog();
//При вызове помощи
const handleHelp = () => toggleHelpDialog();
//Изменение состояния сортировки строк и граф
const handleOrderChange = order => {
onOrderChange && onOrderChange(order);
toggleOrderDialog();
};
//При добавлении показателя
const handleMarkAdd = () => setModMark(true);
//При добавлении показателя по указанным строке/графе
const handleMarkAddByRowCol = (row, column) => onMarkInsert({ row, column });
//При исправлении показателя
const handleMarkUpdate = markDesc => setModMark({ ...markDesc });
//При удалении показателя
const handleMarkDelete = mark => showMsgWarn("Удалить показатель?", () => onMarkDelete && onMarkDelete(mark));
//При переходе к показателю
const handleMarkOpen = mark => showMark(mark, res => res.success && handleRefresh());
//При добавлении состава показателя
const handleMarkCnAdd = mark => showMarkCnAdd(mark, res => res.success && handleRefresh());
//При переходе к составу показателя
const handleMarkCnOpen = (mark, constitution) => showMarkCn(mark, constitution, res => res.success && handleRefresh());
//При закрытии формы добавления/исправления по "ОК"
const handleIUFormOk = values => {
if (modMark === true) onMarkInsert && onMarkInsert(values, res => res && setModMark(null));
else onMarkUpdate && onMarkUpdate({ ...modMark, ...values }, res => res && setModMark(null));
};
//При закрытии формы добавления/исправления по "Отмена"
const handleIUFormCancel = () => setModMark(null);
//Формирование представления
return (
<>
{dialogOrder && }
{dialogHelp && }
{modMark && (
)}
{marksInit &&
(marks ? (
confSctnMrkCellRender({
...prms,
onMarkAdd: handleMarkAddByRowCol,
onMarkUpdate: handleMarkUpdate,
onMarkDelete: handleMarkDelete,
onMarkOpen: handleMarkOpen,
onMarkCnOpen: handleMarkCnOpen,
onMarkCnAdd: handleMarkCnAdd
})
}
headCellRender={prms =>
confSctnMrkHeadCellRender({
...prms,
onAdd: handleMarkAdd,
onRefresh: handleRefresh,
onOrder: handleOrder,
onHelp: handleHelp
})
}
/>
) : (
!marksLoading && (
)
))}
>
);
};
//Контроль свойств - Показатели раздела
Marks.propTypes = {
marks: PropTypes.object,
order: PropTypes.object.isRequired,
marksLoading: PropTypes.bool.isRequired,
marksInit: PropTypes.bool.isRequired,
onRefresh: PropTypes.func,
onMarkInsert: PropTypes.func,
onMarkUpdate: PropTypes.func,
onMarkDelete: PropTypes.func,
onOrderChange: PropTypes.func
};
//----------------
//Интерфейс модуля
//----------------
export { Marks };