From 79eea7f38f1a4bb05b7fa1bb518af3aaf5d120f2 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 20 Sep 2024 14:58:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-902=20-=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20"?= =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=BC=D0=B0"=20=D0=B8=D0=B7=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mech_rec_cost_prod_plans.js | 121 +++++++++++------- db/PKG_P8PANELS_MECHREC.pck | 59 +++++++-- 2 files changed, 122 insertions(+), 58 deletions(-) diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js index a6da453..cea0cad 100644 --- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js +++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js @@ -40,7 +40,9 @@ import { } from "@mui/material"; //Интерфейсные элементы import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений +import { NavigationCtx } from "../../context/navigation"; //Контекст навигации import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения +import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы import { P8PGantt, taskLegendDesc } from "../../components/p8p_gantt"; //Диаграмма Ганта import { xml2JSON, formatDateJSONDateOnly, formatDateRF, hasValue } from "../../core/utils"; //Вспомогательные функции import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки @@ -58,12 +60,6 @@ const DECLINATIONS = ["план", "плана", "планов"]; const SORT_REP_DATE = "DREP_DATE"; const SORT_REP_DATE_TO = "DREP_DATE_TO"; -//Высота диаграммы Ганта -const GANTT_HEIGHT = "75vh"; - -//Ширина диаграммы Ганта -const GANTT_WIDTH = "98vw"; - //Стили const STYLES = { PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" }, @@ -71,20 +67,23 @@ const STYLES = { PLANS_LIST_ITEM_ZERODOCS: { backgroundColor: "#ebecec" }, PLANS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" }, PLANS_LIST_ITEM_SECONDARY: { wordWrap: "break-word", fontSize: "0.6rem", textTransform: "uppercase" }, - PLANS_BUTTON: { position: "absolute" }, + PLANS_BUTTON: { position: "absolute", top: `calc(${APP_BAR_HEIGHT} + 16px)`, left: "16px" }, PLANS_DRAWER: { width: "350px", display: "inline-block", flexShrink: 0, [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" } }, - GANTT_CONTAINER: { height: GANTT_HEIGHT, width: GANTT_WIDTH }, - GANTT_TITLE: { paddingLeft: "100px", paddingRight: "120px" }, + GANTT_CONTAINER: { height: `calc(100vh - ${APP_BAR_HEIGHT})`, width: "100vw", paddingTop: "24px" }, + GANTT_TITLE: { paddingLeft: "250px", paddingRight: "250px" }, SECOND_TABLE: { paddingTop: "30px" }, TASK_DIALOG_CARD_CONTAINER: { padding: "0px" }, TASK_DIALOG_LIST_ITEM_ICON: { justifyContent: "center" }, TASK_DIALOG_ICON: { fontSize: "2rem" }, - TASK_DIALOG_ACTION_CONTAINER: { border: 1, borderColor: "text.primary", borderRadius: "5px", width: "100%" } + TASK_DIALOG_ACTION_CONTAINER: { border: 1, borderColor: "text.primary", borderRadius: "5px", width: "100%" }, + FILTERS: { display: "table", float: "right" }, + FILTERS_DATE: { display: "table-cell", verticalAlign: "middle" }, + FILTERS_LEVEL: { display: "table-cell", verticalAlign: "middle", paddingLeft: "15px" } }; //------------------------------------ @@ -148,7 +147,7 @@ const PlanCtlgsList = ({ planCtlgs = [], selectedPlanCtlg, filter, setFilter, on > {p.SNAME}} - secondary={{formatCountDocs(p.NCOUNT_DOCS)}} + secondary={{formatCountDocs(p.NCOUNT_DOCS)}} /> ))} @@ -210,7 +209,9 @@ const taskDialogRenderer = ({ task, taskColors, close, handleTaskDetailOpen }) = {task["detail_list"]} ) : ( - {`Анализ отклонений недоступен: ${task["detail_list"]}`} + {`Анализ отклонений недоступен${ + task["detail_list"] ? `: ${task["detail_list"]}` : "" + }`} )} @@ -239,7 +240,8 @@ const MechRecCostProdPlans = () => { selectedPlanCtlgGanttDef: {}, selectedPlanCtlgSpecs: [], selectedTaskDetail: null, - selectedTaskDetailType: null + selectedTaskDetailType: null, + planSpec: null }); //Состояние для фильтра каталогов const [filter, setFilter] = useState({ ctlgName: "", haveDocs: false }); @@ -253,7 +255,10 @@ const MechRecCostProdPlans = () => { //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); - // Инициализация каталогов планов + //Подключение к контексту навигации + const { getNavigationSearch } = useContext(NavigationCtx); + + //Инициализация каталогов планов const initPlanCtlgs = useCallback(async () => { if (!state.init) { const data = await executeStored({ @@ -307,7 +312,7 @@ const MechRecCostProdPlans = () => { async (level = null, sort = null) => { const data = await executeStored({ stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET", - args: { NCRN: state.selectedPlanCtlg, NLEVEL: level, SSORT_FIELD: sort } + args: { NCRN: state.selectedPlanCtlg, NLEVEL: level, SSORT_FIELD: sort, NFCPRODPLANSP: state.planSpec } }); let doc = await parseProdPlanSpXML(data.COUT); setState(pv => ({ @@ -324,7 +329,7 @@ const MechRecCostProdPlans = () => { })); }, // eslint-disable-next-line react-hooks/exhaustive-deps - [executeStored, state.ident, state.selectedPlanCtlg] + [executeStored, state.ident, state.selectedPlanCtlg, state.planSpec] ); //Обработка нажатия на элемент в списке каталогов планов @@ -335,14 +340,16 @@ const MechRecCostProdPlans = () => { //При подключении компонента к странице useEffect(() => { - initPlanCtlgs(); + const actionPrms = getNavigationSearch(); + if (actionPrms.NSPRN) setState(pv => ({ ...pv, planSpec: parseInt(actionPrms.NSPRN), init: true })); + else initPlanCtlgs(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - //При смене выбранного каталога плана + //При смене выбранного каталога плана или при явном указании позиции спецификации плана useEffect(() => { - if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO); - }, [state.selectedPlanCtlg, loadPlanCtglSpecs]); + if (state.selectedPlanCtlg || state.planSpec) loadPlanCtglSpecs(null, SORT_REP_DATE_TO); + }, [state.selectedPlanCtlg, state.planSpec, loadPlanCtglSpecs]); //Выбор уровня const handleChangeSelectLevel = selectedLevel => { @@ -368,35 +375,48 @@ const MechRecCostProdPlans = () => { //Генерация содержимого return ( - - setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> - Каталоги планов - - setState(pv => ({ ...pv, showPlanList: false }))} - sx={STYLES.PLANS_DRAWER} - > - - + + {!state.planSpec ? ( + <> + setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> + Каталоги планов + + setState(pv => ({ ...pv, showPlanList: false }))} + sx={STYLES.PLANS_DRAWER} + > + + + + ) : null} {state.init == true ? ( - + {state.selectedPlanCtlgSpecsLoaded ? ( state.selectedPlanCtlgSpecs.length === 0 ? ( - + + + ) : ( - + {state.selectedPlanCtlgMaxLevel ? ( - - + + Сортировка - + До уровня