forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			188 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | ||
|     Парус 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 handleIUDialogOk = values => {
 | ||
|         if (modMark === true) onMarkInsert && onMarkInsert(values, res => res && setModMark(null));
 | ||
|         else onMarkUpdate && onMarkUpdate({ ...modMark, ...values }, res => res && setModMark(null));
 | ||
|     };
 | ||
| 
 | ||
|     //При закрытии диалога добавления/исправления по "Отмена"
 | ||
|     const handleIUDialogCancel = () => setModMark(null);
 | ||
| 
 | ||
|     //Формирование представления
 | ||
|     return (
 | ||
|         <>
 | ||
|             {dialogOrder && <DialogOrder {...order} onOk={handleOrderChange} onCancel={toggleOrderDialog} />}
 | ||
|             {dialogHelp && <DialogHelp onClose={toggleHelpDialog} />}
 | ||
|             {modMark && (
 | ||
|                 <DialogMarkIU
 | ||
|                     {...(modMark === true ? {} : modMark)}
 | ||
|                     insert={modMark === true}
 | ||
|                     onOk={handleIUDialogOk}
 | ||
|                     onCancel={handleIUDialogCancel}
 | ||
|                 />
 | ||
|             )}
 | ||
|             {marksInit &&
 | ||
|                 (marks ? (
 | ||
|                     <P8PDataGrid
 | ||
|                         {...P8P_DATA_GRID_CONFIG_PROPS}
 | ||
|                         {...marks}
 | ||
|                         tableStyle={STYLES.MARKS_DG_TABLE}
 | ||
|                         containerComponentProps={{ elevation: 0, square: true, variant: "outlined", sx: STYLES.MARKS_DG_CONTAINER }}
 | ||
|                         size={P8P_DATA_GRID_SIZE.SMALL}
 | ||
|                         dataCellRender={prms =>
 | ||
|                             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 && (
 | ||
|                         <ActionMessage icon={"info"} title={"В разделе нет показателей"} desc={"Добавьте новый"}>
 | ||
|                             <Button startIcon={<Icon>add</Icon>} onClick={handleMarkAdd}>
 | ||
|                                 Показатель
 | ||
|                             </Button>
 | ||
|                         </ActionMessage>
 | ||
|                     )
 | ||
|                 ))}
 | ||
|         </>
 | ||
|     );
 | ||
| };
 | ||
| 
 | ||
| //Контроль свойств - Показатели раздела
 | ||
| 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 };
 |