diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js deleted file mode 100644 index 7399e07..0000000 --- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js +++ /dev/null @@ -1,318 +0,0 @@ -/* - Парус 8 - Панели мониторинга - ПУП - Производственная программа - Панель мониторинга: Корневая панель производственной программы -*/ - -//--------------------- -//Подключение библиотек -//--------------------- - -import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React -import PropTypes from "prop-types"; //Контроль свойств компонента -import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, Grid, TextField, Select, MenuItem, InputLabel } from "@mui/material"; //Интерфейсные элементы -import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером -import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений -import { ApplicationСtx } from "../../context/application"; //Контекст приложения -import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения -import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта -import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции -import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки - -//--------- -//Константы -//--------- - -//Высота диаграммы Ганта -const GANTT_HEIGHT = "650px"; - -//Ширина диаграммы Ганта -const GANTT_WIDTH = "98vw"; - -//Стили -const STYLES = { - PROJECTS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" }, - PROJECTS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" }, - PROJECTS_LIST_ITEM_SECONDARY: { wordWrap: "break-word", fontSize: "0.5rem", textTransform: "uppercase" }, - PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: { color: "red" }, - PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: { color: "gray" }, - PROJECTS_LIST_ITEM_SECONDARY_CHANGED: { color: "green" }, - PROJECTS_BUTTON: { position: "absolute" }, - PROJECTS_DRAWER: { - minWidth: "250px", - display: "inline-block", - flexShrink: 0, - [`& .MuiDrawer-paper`]: { minWidth: "250px", display: "inline-block", boxSizing: "border-box" } - }, - GANTT_CONTAINER: { height: GANTT_HEIGHT, width: GANTT_WIDTH }, - GANTT_TITLE: { paddingLeft: "100px", paddingRight: "120px" }, - PERIODS_BUTTON: { position: "absolute", right: "20px" }, - PERIODS_DRAWER: { width: "1000px", flexShrink: 0, [`& .MuiDrawer-paper`]: { width: "1000px", boxSizing: "border-box" } } -}; - -//Список проектов -const ProjectsList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => { - //Генерация содержимого - return ( -
- { - setFilter(event.target.value); - }} - > - - {plans.map(p => ( - (onClick ? onClick(p) : null)}> - {p.SDOC_INFO}} - secondary={ - - } - /> - - ))} - -
- ); -}; - -//Контроль свойств - Список проектов -ProjectsList.propTypes = { - plans: PropTypes.array, - selectedPlan: PropTypes.number, - onClick: PropTypes.func, - filter: PropTypes.string, - setFilter: PropTypes.func -}; - -//----------- -//Тело модуля -//----------- - -//Корневая панель производственной программы -const MechRecCostProdPlans = () => { - //Собственное состояние - let [state, setState] = useState({ - init: false, - showPlanList: false, - plans: [], - plansLoaded: false, - selectedPlanSpecsLoaded: false, - selectedPlan: null, - selectedPlanMaxLevel: null, - selectedPlanCurLevel: null, - selectedPlanGanttDef: {}, - selectedPlanSpecs: [] - }); - - const [filter, setFilter] = useState(""); - - const filteredPlans = useFilteredPlans(state.plans, filter); - - //Подключение к контексту приложения - const { pOnlineShowDocument } = useContext(ApplicationСtx); - - //Подключение к контексту сообщений - const { InlineMsgInfo } = useContext(MessagingСtx); - - //Подключение к контексту взаимодействия с сервером - const { executeStored } = useContext(BackEndСtx); - - // Инициализация планов - const initPlans = useCallback(async () => { - if (!state.init) { - const data = await executeStored({ - stored: "PKG_P8PANELS_MECHREC.PRODPLAN_INIT", - args: {}, - respArg: "COUT" - }); - setState(pv => ({ - ...pv, - init: true, - plans: [...(data?.XFCPRODPLANS || [])], - plansLoaded: true - })); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.init, executeStored]); - - //Выбор плана - const selectPlan = project => { - setState(pv => ({ - ...pv, - selectedPlan: project, - selectedPlanSpecsLoaded: false, - selectedPlanMaxLevel: null, - selectedPlanCurLevel: null, - selectedPlanSpecs: [], - selectedPlanGanttDef: {}, - showPlanList: false - })); - }; - - //Сброс выбора плана - const unselectPlan = () => - setState(pv => ({ - ...pv, - selectedPlanSpecsLoaded: false, - selectedPlan: null, - selectedPlanMaxLevel: null, - selectedPlanCurLevel: null, - selectedPlanSpecs: [], - selectedPlanGanttDef: {}, - showPlanList: false - })); - - //Загрузка списка спецификаций плана - const loadPlanSpecs = useCallback( - async (curMaxLevel = null, level = null) => { - const data = await executeStored({ - stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET", - args: { NFCPRODPLAN: state.selectedPlan, NLEVEL: level }, - attributeValueProcessor: (name, val) => - name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val, - respArg: "COUT" - }); - let maxLevel = curMaxLevel ? curMaxLevel : 0; - //Если есть данные - if (data.XGANTT_TASKS) { - //Обходим данные - data.XGANTT_TASKS.forEach(el => { - // Если есть зависимости - if (el.dependencies) { - //Разбиваем их в array - el.dependencies = el.dependencies[0].split(","); - } - //Если уровень больше рассчитанного максимального - maxLevel = maxLevel < el.level ? el.level : maxLevel; - }); - } - setState(pv => ({ - ...pv, - selectedPlanMaxLevel: maxLevel, - selectedPlanCurLevel: level || level === 0 ? level : maxLevel, - selectedPlanSpecsLoaded: true, - selectedPlanGanttDef: data.XGANTT_DEF ? { ...data.XGANTT_DEF } : {}, - selectedPlanSpecs: [...(data?.XGANTT_TASKS || [])] - })); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [executeStored, state.ident, state.selectedPlan] - ); - - //Обработка нажатия на элемент в списке планов - const handleProjectClick = project => { - if (state.selectedPlan != project.NRN) selectPlan(project.NRN); - else unselectPlan(); - }; - - //Отработка нажатия на заголовок плана - const handleTitleClick = () => { - state.selectedPlan ? pOnlineShowDocument({ unitCode: "CostProductPlans", document: state.selectedPlan }) : null; - }; - - //При подключении компонента к странице - useEffect(() => { - initPlans(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - //При смене выбранного плана - useEffect(() => { - if (state.selectedPlan) loadPlanSpecs(); - }, [state.selectedPlan, loadPlanSpecs]); - - //Выбор уровня - const handleChangeSelectList = selectedLevel => { - loadPlanSpecs(state.selectedPlanMaxLevel, selectedLevel); - setState(pv => ({ ...pv, selectedPlanCurLevel: selectedLevel })); - }; - - //Генерация содержимого - return ( - - setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> - Планы - - setState(pv => ({ ...pv, showPlanList: false }))} - sx={STYLES.PROJECTS_DRAWER} - > - - - {state.init == true ? ( - - - {state.selectedPlanSpecsLoaded ? ( - state.selectedPlanSpecs.length === 0 ? ( - - ) : ( - - {state.selectedPlanMaxLevel ? ( - - Уровень - - - ) : null} - - - ) - ) : !state.selectedPlan ? ( - - ) : null} - - - ) : null} - - ); -}; - -//---------------- -//Интерфейс модуля -//---------------- - -export { MechRecCostProdPlans };