From 92d3371b4d6b207d38aaa8757414261d3aa4f886 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 8 Feb 2024 14:52:16 +0300 Subject: [PATCH] =?UTF-8?q?WEB=20APP:=20=D0=9F=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20"=D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0"=20-=20=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8?= =?UTF-8?q?=D0=BC=D1=91=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=20=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2,=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=88=D0=BD=D0=B5=D0=B9=20=D0=B2=D1=91=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B8,=20=D1=80=D0=B0=D1=81=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B3=D0=BB=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D1=83,=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D1=91=D0=BD=20isArray=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=D0=BE=D0=B2=D1=8B=D1=85=20=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D1=80=D0=BD=D1=8B=D1=85=20=D1=8D=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20("XGANTT=5FTASKS"),=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D1=8F=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/mech_rec_cost_prod_plans/hooks.js | 16 ++- .../mech_rec_cost_prod_plans.js | 109 +++++++----------- 2 files changed, 58 insertions(+), 67 deletions(-) diff --git a/app/panels/mech_rec_cost_prod_plans/hooks.js b/app/panels/mech_rec_cost_prod_plans/hooks.js index 62664b1..3cf45a9 100644 --- a/app/panels/mech_rec_cost_prod_plans/hooks.js +++ b/app/panels/mech_rec_cost_prod_plans/hooks.js @@ -1,5 +1,19 @@ -import React from "react"; +/* + Парус 8 - Панели мониторинга - ПУП - Производственная программа + Кастомные хуки +*/ +//--------------------- +//Подключение библиотек +//--------------------- + +import React from "react"; //Классы React + +//----------- +//Тело модуля +//----------- + +//Клиентский отбор загруженных планов по поисковой фразе export const useFilteredPlans = (plans, filter) => { const filteredPlans = React.useMemo(() => { return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter)); 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 025db4f..10fd417 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 @@ -31,32 +31,50 @@ 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: { + PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" }, + PLANS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" }, + PLANS_BUTTON: { position: "absolute" }, + PLANS_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" } } + GANTT_TITLE: { paddingLeft: "100px", paddingRight: "120px" } }; -//Список проектов -const ProjectsList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => { +//------------------------------------ +//Вспомогательные функции и компоненты +//------------------------------------ + +//Разбор XML с данными спецификации производственной программы +const parseProdPlanSpXML = xmlDoc => { + return new Promise((resolve, reject) => { + try { + const parser = new XMLParser({ + ignoreDeclaration: true, + ignoreAttributes: false, + parseAttributeValue: true, + attributeNamePrefix: "", + attributeValueProcessor: (name, val) => + name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val + }); + const data = parser.parse(xmlDoc); + resolve(data.XDATA); + } catch (e) { + reject(e); + } + }); +}; + +//Список планов +const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => { //Генерация содержимого return (
{plans.map(p => ( (onClick ? onClick(p) : null)}> - {p.SDOC_INFO}} - secondary={ - - } - /> + {p.SDOC_INFO}} /> ))} @@ -91,8 +95,8 @@ const ProjectsList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = ); }; -//Контроль свойств - Список проектов -ProjectsList.propTypes = { +//Контроль свойств - Список планов +PlansList.propTypes = { plans: PropTypes.array, selectedPlan: PropTypes.number, onClick: PropTypes.func, @@ -104,26 +108,6 @@ ProjectsList.propTypes = { //Тело модуля //----------- -//Разбор XML -const parseXML = (xmlDoc, attributeValueProcessor) => { - return new Promise((resolve, reject) => { - try { - let opts = { - ignoreDeclaration: true, - ignoreAttributes: false, - parseAttributeValue: true, - attributeNamePrefix: "" - }; - if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor; - const parser = new XMLParser(opts); - const data = parser.parse(xmlDoc); - resolve(data.XDATA); - } catch (e) { - reject(e); - } - }); -}; - //Корневая панель производственной программы const MechRecCostProdPlans = () => { //Собственное состояние @@ -160,14 +144,10 @@ const MechRecCostProdPlans = () => { const data = await executeStored({ stored: "PKG_P8PANELS_MECHREC.PRODPLAN_INIT", args: {}, - respArg: "COUT" + respArg: "COUT", + isArray: name => name === "XFCPRODPLANS" }); - setState(pv => ({ - ...pv, - init: true, - plans: [...(data?.XFCPRODPLANS || [])], - plansLoaded: true - })); + setState(pv => ({ ...pv, init: true, plans: [...(data?.XFCPRODPLANS || [])], plansLoaded: true })); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.init, executeStored]); @@ -208,11 +188,7 @@ const MechRecCostProdPlans = () => { stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET", args: { NFCPRODPLAN: state.selectedPlan, NLEVEL: level } }); - let doc = await parseXML(data.COUT, (name, val) => - name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val - ); - console.log(doc.XGANTT_DEF); - console.log(doc.XGANTT_TASKS); + let doc = await parseProdPlanSpXML(data.COUT); setState(pv => ({ ...pv, selectedPlanMaxLevel: data.NMAX_LEVEL, @@ -256,19 +232,20 @@ const MechRecCostProdPlans = () => { loadPlanSpecs(selectedLevel); setState(pv => ({ ...pv, selectedPlanLevel: selectedLevel })); }; + //Генерация содержимого return ( - setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> + setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> Планы setState(pv => ({ ...pv, showPlanList: false }))} - sx={STYLES.PROJECTS_DRAWER} + sx={STYLES.PLANS_DRAWER} > -