From de4fb84a7fe732750ff81c385a62bc164cad8e8b Mon Sep 17 00:00:00 2001 From: Dollerino Date: Mon, 5 Feb 2024 16:17:09 +0300 Subject: [PATCH 01/27] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-784=20(=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B2=D0=BE?= =?UTF-8?q?=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D1=86=D0=B2=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B0,=20=D0=B3=D1=80=D0=B0=D0=B4=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BD=D0=B0=D1=8F=20=D0=B7=D0=B0=D0=BB=D0=B8=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=B5=D0=B3=D0=B5=D0=BD=D0=B4=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/p8p_gantt.js | 18 +++++++++++++++--- db/PKG_P8PANELS_VISUAL.pck | 3 +++ libs/frappe-gantt/frappe-gantt.js | 3 +++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/components/p8p_gantt.js b/app/components/p8p_gantt.js index 3f39842..83ce867 100644 --- a/app/components/p8p_gantt.js +++ b/app/components/p8p_gantt.js @@ -59,7 +59,8 @@ const P8P_GANTT_TASK_SHAPE = PropTypes.shape({ readOnlyDates: PropTypes.bool, readOnlyProgress: PropTypes.bool, bgColor: PropTypes.string, - textColor: PropTypes.string + textColor: PropTypes.string, + bgProgressColor: PropTypes.string }); //Структура динамического атрибута задачи @@ -72,6 +73,7 @@ const P8P_GANTT_TASK_ATTRIBUTE_SHAPE = PropTypes.shape({ const P8P_GANTT_TASK_COLOR_SHAPE = PropTypes.shape({ bgColor: PropTypes.string, textColor: PropTypes.string, + bgProgressColor: PropTypes.string, desc: PropTypes.string.isRequired }); @@ -126,14 +128,24 @@ const P8PGanttTaskEditor = ({ //Описание легенды для задачи let legend = null; if (Array.isArray(taskColors)) { - const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor); + const colorDesc = taskColors.find( + color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor + ); if (colorDesc) legend = ( SRESP_ATTR_TASK_TEXT_COLOR, SVALUE => RGANTT.RTASK_COLORS(I).STEXT_COLOR); end if; + if (RGANTT.RTASK_COLORS(I).SBG_PROGRESS_COLOR is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_PRG_COLOR, SVALUE => RGANTT.RTASK_COLORS(I).SBG_PROGRESS_COLOR); + end if; PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DESC, SVALUE => RGANTT.RTASK_COLORS(I).SDESC); /* Закрываем описание цвета задачи */ PKG_XFAST.UP(); diff --git a/libs/frappe-gantt/frappe-gantt.js b/libs/frappe-gantt/frappe-gantt.js index 0ca18a0..da08f9f 100644 --- a/libs/frappe-gantt/frappe-gantt.js +++ b/libs/frappe-gantt/frappe-gantt.js @@ -473,6 +473,9 @@ var Gantt = (function () { class: 'bar-progress', append_to: this.bar_group, }); + //ЦИТК + if (this.task.bgProgressColor) this.$bar_progress.style.fill = this.task.bgProgressColor; + //ЦИТК animateSVG(this.$bar_progress, 'width', 0, this.progress_width); } -- 2.34.1 From 29cbfe1cbe5a935ffb889655b02f88a15ec79a6f Mon Sep 17 00:00:00 2001 From: Dollerino Date: Mon, 5 Feb 2024 16:51:24 +0300 Subject: [PATCH 02/27] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-784=20-=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BB=D1=8C=20"=D0=9F=D1=80=D0=BE=D0=B8=D0=B7?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/mech_rec_cost_prod_plans/hooks.js | 9 + app/panels/mech_rec_cost_prod_plans/index.js | 16 + .../mech_rec_cost_prod_plans copy.js | 318 +++++++++++++ .../mech_rec_cost_prod_plans.js | 332 ++++++++++++++ db/PKG_P8PANELS_MECHREC.pck | 426 ++++++++++++++++++ dist/p8-panels.js | 367 +++++++++++---- p8panels.config | 20 +- 7 files changed, 1407 insertions(+), 81 deletions(-) create mode 100644 app/panels/mech_rec_cost_prod_plans/hooks.js create mode 100644 app/panels/mech_rec_cost_prod_plans/index.js create mode 100644 app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js create mode 100644 app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js create mode 100644 db/PKG_P8PANELS_MECHREC.pck diff --git a/app/panels/mech_rec_cost_prod_plans/hooks.js b/app/panels/mech_rec_cost_prod_plans/hooks.js new file mode 100644 index 0000000..62664b1 --- /dev/null +++ b/app/panels/mech_rec_cost_prod_plans/hooks.js @@ -0,0 +1,9 @@ +import React from "react"; + +export const useFilteredPlans = (plans, filter) => { + const filteredPlans = React.useMemo(() => { + return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter)); + }, [plans, filter]); + + return filteredPlans; +}; diff --git a/app/panels/mech_rec_cost_prod_plans/index.js b/app/panels/mech_rec_cost_prod_plans/index.js new file mode 100644 index 0000000..026a81c --- /dev/null +++ b/app/panels/mech_rec_cost_prod_plans/index.js @@ -0,0 +1,16 @@ +/* + Парус 8 - Панели мониторинга - ПУП - Производственная программа + Панель мониторинга: Точка входа +*/ + +//--------------------- +//Подключение библиотек +//--------------------- + +import { MechRecCostProdPlans } from "./mech_rec_cost_prod_plans"; //Корневая панель производственной программы + +//---------------- +//Интерфейс модуля +//---------------- + +export const RootClass = MechRecCostProdPlans; 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 new file mode 100644 index 0000000..7399e07 --- /dev/null +++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js @@ -0,0 +1,318 @@ +/* + Парус 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 }; 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 new file mode 100644 index 0000000..025db4f --- /dev/null +++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js @@ -0,0 +1,332 @@ +/* + Парус 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"; //Вспомогательные хуки +import { XMLParser } from "fast-xml-parser"; + +//--------- +//Константы +//--------- + +//Высота диаграммы Ганта +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 +}; + +//----------- +//Тело модуля +//----------- + +//Разбор 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 = () => { + //Собственное состояние + let [state, setState] = useState({ + init: false, + showPlanList: false, + plans: [], + plansLoaded: false, + selectedPlanSpecsLoaded: false, + selectedPlan: null, + selectedPlanMaxLevel: null, + selectedPlanLevel: null, + selectedPlanMenuItems: 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, + selectedPlanLevel: null, + selectedPlanMenuItems: null, + selectedPlanSpecs: [], + selectedPlanGanttDef: {}, + showPlanList: false + })); + }; + + //Сброс выбора плана + const unselectPlan = () => + setState(pv => ({ + ...pv, + selectedPlanSpecsLoaded: false, + selectedPlan: null, + selectedPlanMaxLevel: null, + selectedPlanLevel: null, + selectedPlanMenuItems: null, + selectedPlanSpecs: [], + selectedPlanGanttDef: {}, + showPlanList: false + })); + + //Загрузка списка спецификаций плана + const loadPlanSpecs = useCallback( + async (level = null) => { + const data = await executeStored({ + 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); + setState(pv => ({ + ...pv, + selectedPlanMaxLevel: data.NMAX_LEVEL, + selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL, + selectedPlanMenuItems: state.selectedPlanMenuItems + ? state.selectedPlanMenuItems + : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1), + selectedPlanSpecsLoaded: true, + selectedPlanGanttDef: doc.XGANTT_DEF ? { ...doc.XGANTT_DEF } : {}, + selectedPlanSpecs: [...(doc?.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(selectedLevel); + setState(pv => ({ ...pv, selectedPlanLevel: 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 }; diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck new file mode 100644 index 0000000..1e01d67 --- /dev/null +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -0,0 +1,426 @@ +create or replace package PKG_P8PANELS_MECHREC as + + /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */ + procedure FCPRODPLANSP_GET + ( + NFCPRODPLAN in number, -- Рег. номер родителя + NLEVEL in number := null, -- Уровень отбора + COUT out clob, -- Список проектов + NMAX_LEVEL out number -- Максимальный уровень иерархии + ); + + /* Инициализация планов и отчетов производства изделий */ + procedure PRODPLAN_INIT + ( + COUT out clob -- Список планов и отчетов производства изделий + ); + +end PKG_P8PANELS_MECHREC; +/ +create or replace package body PKG_P8PANELS_MECHREC as + + /* Константы - цвета отображения */ + SBG_COLOR_RED constant PKG_STD.TSTRING := 'red'; -- Цвет заливки красный (Дефицит запуска != 0) + SBG_COLOR_YELLOW constant PKG_STD.TSTRING := '#e0db44'; -- Цвет заливки желтый (Дефицит» запуска = 0 и Выпуск факт = 0) + SBG_COLOR_GREEN constant PKG_STD.TSTRING := 'lightgreen'; -- Цвет заливки зеленый (Дефицит выпуска = 0) + SBG_COLOR_BLACK constant PKG_STD.TSTRING := 'black'; -- Цвет заливки черный (Нет дат и связей) + STEXT_COLOR_ORANGE constant PKG_STD.TSTRING := '#FF8C00'; -- Цвет текста для черной заливки (оранжевый) + + /* Константы - параметры отборов планов */ + NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа" + NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден" + SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния) + + /* Константы - дополнительные атрибуты */ + STASK_ATTR_DEFRESLIZ constant PKG_STD.TSTRING := 'defresliz'; -- Дефицит запуска + STASK_ATTR_REL_FACT constant PKG_STD.TSTRING := 'rel_fact'; -- Выпуск факт + STASK_ATTR_DEFSTART constant PKG_STD.TSTRING := 'defstart'; -- Дефицит выпуска + STASK_ATTR_LEVEL constant PKG_STD.TSTRING := 'level'; -- Уровень + + /* Формирование характеристик спецификации в Ганте */ + procedure MAKE_GANT_ITEM + ( + NDEFRESLIZ in number, -- Дефицит запуска + NREL_FACT in number, -- Выпуск факт + NDEFSTART in number, -- Дефицит выпуска + STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации + STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации + NTASK_PROGRESS out number -- Прогресс спецификации + ) + is + begin + /* Если дефицит запуска <> 0 */ + if (NDEFRESLIZ <> 0) then + /* Полностью красный */ + STASK_BG_COLOR := SBG_COLOR_RED; + STASK_BG_PROGRESS_COLOR := null; + NTASK_PROGRESS := null; + else + /* Если дефицит выпуска = 0 */ + if (NDEFSTART = 0) then + /* Полностью зеленый */ + STASK_BG_COLOR := SBG_COLOR_GREEN; + STASK_BG_PROGRESS_COLOR := null; + NTASK_PROGRESS := null; + else + /* Если дефицит запуска = 0 и выпуск факт = 0 */ + if ((NDEFRESLIZ = 0) and (NREL_FACT = 0)) then + /* Полностью жёлтый */ + STASK_BG_COLOR := SBG_COLOR_YELLOW; + STASK_BG_PROGRESS_COLOR := null; + NTASK_PROGRESS := null; + end if; + /* Если дефицит запуска = 0 и выпуск факт <> 0 */ + if ((NDEFRESLIZ = 0) and (NREL_FACT <> 0)) then + /* Частично зелёный, прогресс жёлтый */ + STASK_BG_COLOR := SBG_COLOR_GREEN; + STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW; + NTASK_PROGRESS := 50; + end if; + end if; + end if; + end MAKE_GANT_ITEM; + + /* Считывание заголовка документа */ + function TITLE_GET + ( + NRN in number -- Рег. номер плана и отчета производства изделий + ) return varchar2 -- Заголовок для отображения + is + SRESULT PKG_STD.TSTRING; -- Заголовок для отображения + SDOC_INFO PKG_STD.TSTRING; -- Информация о документе + SJURPERSONS_CODE PKG_STD.TSTRING; -- Мнемокод принадлежности + SINS_DEPARTMENT_CODE PKG_STD.TSTRING; -- Мнемокод подразделения + begin + /* Считываем информацию из плана */ + begin + select D.DOCCODE || ', ' || trim(T.PREFIX) || '/' || trim(T.NUMB) || ', от ' || TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') DOC_INFO, + J.CODE, + SD.CODE + into SDOC_INFO, + SJURPERSONS_CODE, + SINS_DEPARTMENT_CODE + from FCPRODPLAN T, + DOCTYPES D, + JURPERSONS J, + INS_DEPARTMENT SD + where T.RN = NRN + and D.RN = T.DOCTYPE + and J.RN = T.JUR_PERS + and SD.RN = T.SUBDIV; + exception + when others then + return 'Нет информации.'; + end; + /* Формируем заголовок */ + SRESULT := 'План и отчет производства изделия "' || SDOC_INFO || '", принадлежность "' || SJURPERSONS_CODE || + '", подразделение "' || SINS_DEPARTMENT_CODE || '"'; + /* Возвращаем результат */ + return SRESULT; + end TITLE_GET; + + /* Считывание максимального уровня иерархии плана */ + function PRODPLAN_MAX_LEVEL_GET + ( + NPRODPLAN in number -- Рег. номер плана + ) return number -- Максимальный уровень иерархии + is + NRESULT PKG_STD.TNUMBER; -- Максимальный уровень иерархии + begin + /* Считываем максимальный уровень */ + begin + select max(level) + into NRESULT + from (select T.RN, + T.UP_LEVEL + from FCPRODPLANSP T + where T.PRN = NPRODPLAN) TMP + connect by prior TMP.RN = TMP.UP_LEVEL + start with TMP.UP_LEVEL is null; + exception + when others then + NRESULT := null; + end; + /* Возвращаем результат */ + return NRESULT; + end PRODPLAN_MAX_LEVEL_GET; + + /* Определение дат спецификации плана */ + procedure FCPRODPLANSP_DATES_GET + ( + DREP_DATE in date, -- Дата запуска спецификации + DREP_DATE_TO in date, -- Дата выпуска спецификации + DINCL_DATE in date, -- Дата включения в план спецификации + NHAVE_LINK in number := 0, -- Наличие связей с "Маршрутный лист" или "Приход из подразделения" + DDATE_FROM out date, -- Итоговая дата запуска спецификации + DDATE_TO out date, -- Итоговая дата выпуска спецификации + STASK_BG_COLOR out varchar2, -- Цвет элемента (черный, если даты не заданы и нет связи, иначе null) + STASK_TEXT_COLOR out varchar2, -- Цвет текста элемента (хаки, если даты не заданы и нет связи, иначе null) + NTASK_PROGRESS out number -- Прогресс элемента (проинициализирует null, если даты не заданы и нет связи) + ) + is + begin + /* Проициниализируем цвет и прогресс */ + STASK_BG_COLOR := null; + NTASK_PROGRESS := null; + STASK_TEXT_COLOR := null; + /* Если даты запуска и выпуска пусты */ + if ((DREP_DATE is null) and (DREP_DATE_TO is null)) then + /* Указываем дату включения в план */ + DDATE_FROM := DINCL_DATE; + DDATE_TO := DINCL_DATE; + else + /* Указываем даты исходя из дат запуска/выпуска */ + DDATE_FROM := COALESCE(DREP_DATE, DREP_DATE_TO); + DDATE_TO := COALESCE(DREP_DATE_TO, DREP_DATE); + end if; + /* Если одна из дат не указана */ + if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then + /* Если спецификация также не имеет связей */ + if (NHAVE_LINK = 0) then + /* Закрашиваем в черный */ + STASK_BG_COLOR := SBG_COLOR_BLACK; + STASK_TEXT_COLOR := STEXT_COLOR_ORANGE; + NTASK_PROGRESS := null; + end if; + end if; + end FCPRODPLANSP_DATES_GET; + + /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */ + procedure FCPRODPLANSP_GET + ( + NFCPRODPLAN in number, -- Рег. номер родителя + NLEVEL in number := null, -- Уровень отбора + COUT out clob, -- Список проектов + NMAX_LEVEL out number -- Максимальный уровень иерархии + ) + is + /* Переменные */ + RG PKG_P8PANELS_VISUAL.TGANTT; -- Описание диаграммы Ганта + RGT PKG_P8PANELS_VISUAL.TGANTT_TASK; -- Описание задачи для диаграммы + BREAD_ONLY_DATES boolean := false; -- Флаг доступности дат проекта только для чтения + STASK_BG_COLOR PKG_STD.TSTRING; -- Цвет заливки задачи + STASK_TEXT_COLOR PKG_STD.TSTRING; -- Цвет текста задачи + STASK_BG_PROGRESS_COLOR PKG_STD.TSTRING; -- Цвет заливки прогресса задачи + NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи + DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации + DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации + begin + /* Инициализируем диаграмму Ганта */ + RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => TITLE_GET(NRN => NFCPRODPLAN), + NZOOM => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_DAY, + BREAD_ONLY_DATES => BREAD_ONLY_DATES, + BREAD_ONLY_PROGRESS => true); + /* Добавим динамические атрибуты к спецификациям */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_DEFRESLIZ, + SCAPTION => 'Дефицит запуска'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_REL_FACT, + SCAPTION => 'Выпуск факт'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_DEFSTART, + SCAPTION => 'Дефицит выпуска'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_LEVEL, SCAPTION => 'Уровень'); + /* Добавим описание цветов */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_RED, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0.'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_YELLOW, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_GREEN, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_GREEN, + SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. '); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_BLACK, + STEXT_COLOR => STEXT_COLOR_ORANGE, + SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».'); + /* Определяем максимальный уровень иерархии */ + NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NPRODPLAN => NFCPRODPLAN); + /* Цикл по спецификации плана с учетом иерархии */ + for REC in (select TMP.*, + level + from (select T.RN, + T.REP_DATE, + T.REP_DATE_TO, + T.INCL_DATE, + T.ROUTE, + D.NOMEN_NAME, + (T.QUANT_REST - T.START_FACT) DEFRESLIZ, + T.REL_FACT, + (T.MAIN_QUANT - T.REL_FACT) DEFSTART, + (select 1 + from DUAL + where exists + (select null + from DOCLINKS L + where L.IN_DOCUMENT = T.RN + and L.IN_UNITCODE = 'CostProductPlansSpecs' + and (L.OUT_UNITCODE = 'CostRouteLists' or L.OUT_UNITCODE = 'IncomFromDeps') + and ROWNUM = 1)) HAVE_LINK, + T.UP_LEVEL + from FCPRODPLANSP T, + FCMATRESOURCE FM, + DICNOMNS D + where T.PRN = NFCPRODPLAN + and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null)) + and FM.RN = T.MATRES + and D.RN = FM.NOMENCLATURE) TMP + where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL))) + connect by prior TMP.RN = TMP.UP_LEVEL + start with TMP.UP_LEVEL is null) + loop + /* Инициализируем даты и цвет (если необходимо) */ + FCPRODPLANSP_DATES_GET(DREP_DATE => REC.REP_DATE, + DREP_DATE_TO => REC.REP_DATE_TO, + DINCL_DATE => REC.INCL_DATE, + NHAVE_LINK => COALESCE(REC.HAVE_LINK, 0), + DDATE_FROM => DDATE_FROM, + DDATE_TO => DDATE_TO, + STASK_BG_COLOR => STASK_BG_COLOR, + STASK_TEXT_COLOR => STASK_TEXT_COLOR, + NTASK_PROGRESS => NTASK_PROGRESS); + /* Если цвет изначально не указан и требуется анализирование */ + if (STASK_BG_COLOR is null) then + /* Формирование характеристик элемента ганта */ + MAKE_GANT_ITEM(NDEFRESLIZ => REC.DEFRESLIZ, + NREL_FACT => REC.REL_FACT, + NDEFSTART => REC.DEFSTART, + STASK_BG_COLOR => STASK_BG_COLOR, + STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, + NTASK_PROGRESS => NTASK_PROGRESS); + end if; + /* Сформируем основную спецификацию */ + RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => REC.RN, + SNUMB => COALESCE(REC.ROUTE, 'Отсутствует'), + SCAPTION => REC.NOMEN_NAME, + SNAME => REC.NOMEN_NAME, + DSTART => DDATE_FROM, + DEND => DDATE_TO, + NPROGRESS => NTASK_PROGRESS, + SBG_COLOR => STASK_BG_COLOR, + STEXT_COLOR => STASK_TEXT_COLOR, + SBG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, + BREAD_ONLY => true, + BREAD_ONLY_DATES => true, + BREAD_ONLY_PROGRESS => true); + /* Добавим доп. атрибуты */ + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_DEFRESLIZ, + SVALUE => TO_CHAR(REC.DEFRESLIZ), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_REL_FACT, + SVALUE => TO_CHAR(REC.REL_FACT)); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_DEFSTART, + SVALUE => TO_CHAR(REC.DEFSTART)); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_LEVEL, + SVALUE => REC.LEVEL); + /* Собираем зависимости */ + for LINK in (select T.RN + from FCPRODPLANSP T + where T.PRN = NFCPRODPLAN + and T.UP_LEVEL = REC.RN + and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= REC.LEVEL + 1)))) + loop + /* Добавляем зависимости */ + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN); + end loop; + /* Добавляем основную спецификацию в диаграмму */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT); + end loop; + /* Формируем список */ + COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG); + end FCPRODPLANSP_GET; + + /* Инициализация планов и отчетов производства изделий */ + procedure PRODPLAN_INIT + ( + COUT out clob -- Список планов и отчетов производства изделий + ) + is + begin + /* Начинаем формирование XML */ + PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); + /* Открываем корень */ + PKG_XFAST.DOWN_NODE(SNAME => 'XDATA'); + /* Цикл по планам и отчетам производства изделий */ + for REC in (select T.RN NRN, + D.DOCCODE || ', ' || trim(T.PREFIX) || '/' || trim(T.NUMB) || ', ' || + TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO + from FCPRODPLAN T, + DOCTYPES D, + FINSTATE FS + where T.CATEGORY = NFCPRODPLAN_CATEGORY + and T.STATUS = NFCPRODPLAN_STATUS + and D.RN = T.DOCTYPE + and FS.RN = T.TYPE + and FS.CODE = SFCPRODPLAN_TYPE + and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ + null + from USERPRIV UP + where UP.CATALOG = T.CRN + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ + null + from USERPRIV UP + where UP.CATALOG = T.CRN + and UP.AUTHID = UTILIZER) + and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ + null + from USERPRIV UP + where UP.JUR_PERS = T.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ + null + from USERPRIV UP + where UP.JUR_PERS = T.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.AUTHID = UTILIZER) + order by T.DOCDATE desc) + loop + /* Открываем план */ + PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLANS'); + /* Описываем план */ + PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN); + PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => REC.SDOC_INFO); + /* Закрываем план */ + PKG_XFAST.UP(); + end loop; + /* Закрываем корень */ + PKG_XFAST.UP(); + /* Сериализуем */ + COUT := PKG_XFAST.SERIALIZE_TO_CLOB(); + /* Завершаем формирование XML */ + PKG_XFAST.EPILOGUE(); + exception + when others then + /* Завершаем формирование XML */ + PKG_XFAST.EPILOGUE(); + /* Вернем ошибку */ + PKG_STATE.DIAGNOSTICS_STACKED(); + P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); + end PRODPLAN_INIT; + +end PKG_P8PANELS_MECHREC; +/ diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 27c69d5..b30f64b 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -15,7 +15,7 @@ \***********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); +eval("var map = {\n\t\"./alex\": \"./app/panels/alex/index.js\",\n\t\"./alex/\": \"./app/panels/alex/index.js\",\n\t\"./alex/alex\": \"./app/panels/alex/alex.js\",\n\t\"./alex/alex.js\": \"./app/panels/alex/alex.js\",\n\t\"./alex/index\": \"./app/panels/alex/index.js\",\n\t\"./alex/index.js\": \"./app/panels/alex/index.js\",\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_agn_info\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/TabsElements/agentChart\": \"./app/panels/prj_agn_info/TabsElements/agentChart.js\",\n\t\"./prj_agn_info/TabsElements/agentChart.js\": \"./app/panels/prj_agn_info/TabsElements/agentChart.js\",\n\t\"./prj_agn_info/TabsElements/agentContracts\": \"./app/panels/prj_agn_info/TabsElements/agentContracts.js\",\n\t\"./prj_agn_info/TabsElements/agentContracts.js\": \"./app/panels/prj_agn_info/TabsElements/agentContracts.js\",\n\t\"./prj_agn_info/TabsElements/agentInfo\": \"./app/panels/prj_agn_info/TabsElements/agentInfo.js\",\n\t\"./prj_agn_info/TabsElements/agentInfo.js\": \"./app/panels/prj_agn_info/TabsElements/agentInfo.js\",\n\t\"./prj_agn_info/back\": \"./app/panels/prj_agn_info/back.js\",\n\t\"./prj_agn_info/back.js\": \"./app/panels/prj_agn_info/back.js\",\n\t\"./prj_agn_info/index\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/index.js\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/prj_agn_info\": \"./app/panels/prj_agn_info/prj_agn_info.js\",\n\t\"./prj_agn_info/prj_agn_info.js\": \"./app/panels/prj_agn_info/prj_agn_info.js\",\n\t\"./prj_agn_info/tabs\": \"./app/panels/prj_agn_info/tabs.js\",\n\t\"./prj_agn_info/tabs.js\": \"./app/panels/prj_agn_info/tabs.js\",\n\t\"./prj_agn_info/utils\": \"./app/panels/prj_agn_info/utils.js\",\n\t\"./prj_agn_info/utils.js\": \"./app/panels/prj_agn_info/utils.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); /***/ }), @@ -1603,6 +1603,50 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/TabScrollButton/TabScrollButton.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@mui/material/TabScrollButton/TabScrollButton.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/base/utils/useSlotProps.js\");\n/* harmony import */ var _internal_svg_icons_KeyboardArrowLeft__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../internal/svg-icons/KeyboardArrowLeft */ \"./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js\");\n/* harmony import */ var _internal_svg_icons_KeyboardArrowRight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../internal/svg-icons/KeyboardArrowRight */ \"./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ButtonBase */ \"./node_modules/@mui/material/ButtonBase/ButtonBase.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../styles/useTheme */ \"./node_modules/@mui/material/styles/useTheme.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _tabScrollButtonClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tabScrollButtonClasses */ \"./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n/* eslint-disable jsx-a11y/aria-role */\n\n\nconst _excluded = [\"className\", \"slots\", \"slotProps\", \"direction\", \"orientation\", \"disabled\"];\n\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n orientation,\n disabled\n } = ownerState;\n const slots = {\n root: ['root', orientation, disabled && 'disabled']\n };\n return (0,_mui_base__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(slots, _tabScrollButtonClasses__WEBPACK_IMPORTED_MODULE_6__.getTabScrollButtonUtilityClass, classes);\n};\nconst TabScrollButtonRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ButtonBase__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n name: 'MuiTabScrollButton',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.orientation && styles[ownerState.orientation]];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n width: 40,\n flexShrink: 0,\n opacity: 0.8,\n [`&.${_tabScrollButtonClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"].disabled}`]: {\n opacity: 0\n }\n}, ownerState.orientation === 'vertical' && {\n width: '100%',\n height: 40,\n '& svg': {\n transform: `rotate(${ownerState.isRtl ? -90 : 90}deg)`\n }\n}));\nconst TabScrollButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function TabScrollButton(inProps, ref) {\n var _slots$StartScrollBut, _slots$EndScrollButto;\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__[\"default\"])({\n props: inProps,\n name: 'MuiTabScrollButton'\n });\n const {\n className,\n slots = {},\n slotProps = {},\n direction\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const theme = (0,_styles_useTheme__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const isRtl = theme.direction === 'rtl';\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n isRtl\n }, props);\n const classes = useUtilityClasses(ownerState);\n const StartButtonIcon = (_slots$StartScrollBut = slots.StartScrollButtonIcon) != null ? _slots$StartScrollBut : _internal_svg_icons_KeyboardArrowLeft__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\n const EndButtonIcon = (_slots$EndScrollButto = slots.EndScrollButtonIcon) != null ? _slots$EndScrollButto : _internal_svg_icons_KeyboardArrowRight__WEBPACK_IMPORTED_MODULE_12__[\"default\"];\n const startButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: StartButtonIcon,\n externalSlotProps: slotProps.startScrollButtonIcon,\n additionalProps: {\n fontSize: 'small'\n },\n ownerState\n });\n const endButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: EndButtonIcon,\n externalSlotProps: slotProps.endScrollButtonIcon,\n additionalProps: {\n fontSize: 'small'\n },\n ownerState\n });\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(TabScrollButtonRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n component: \"div\",\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n ref: ref,\n role: null,\n ownerState: ownerState,\n tabIndex: null\n }, other, {\n children: direction === 'left' ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(StartButtonIcon, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, startButtonIconProps)) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(EndButtonIcon, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, endButtonIconProps))\n }));\n});\n true ? TabScrollButton.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * The content of the component.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().node),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n /**\n * The direction the button should indicate.\n */\n direction: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOf(['left', 'right']).isRequired,\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool),\n /**\n * The component orientation (layout flow direction).\n */\n orientation: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOf(['horizontal', 'vertical']).isRequired,\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n * @default {}\n */\n slotProps: prop_types__WEBPACK_IMPORTED_MODULE_14___default().shape({\n endScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)]),\n startScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)])\n }),\n /**\n * The components used for each slot inside.\n * @default {}\n */\n slots: prop_types__WEBPACK_IMPORTED_MODULE_14___default().shape({\n EndScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().elementType),\n StartScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().elementType)\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)])\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TabScrollButton);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/TabScrollButton/TabScrollButton.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getTabScrollButtonUtilityClass: () => (/* binding */ getTabScrollButtonUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getTabScrollButtonUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiTabScrollButton', slot);\n}\nconst tabScrollButtonClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiTabScrollButton', ['root', 'vertical', 'horizontal', 'disabled']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tabScrollButtonClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/Tab/Tab.js": +/*!***********************************************!*\ + !*** ./node_modules/@mui/material/Tab/Tab.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ButtonBase */ \"./node_modules/@mui/material/ButtonBase/ButtonBase.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./node_modules/@mui/material/utils/capitalize.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _utils_unsupportedProp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/unsupportedProp */ \"./node_modules/@mui/material/utils/unsupportedProp.js\");\n/* harmony import */ var _tabClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tabClasses */ \"./node_modules/@mui/material/Tab/tabClasses.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"className\", \"disabled\", \"disableFocusRipple\", \"fullWidth\", \"icon\", \"iconPosition\", \"indicator\", \"label\", \"onChange\", \"onClick\", \"onFocus\", \"selected\", \"selectionFollowsFocus\", \"textColor\", \"value\", \"wrapped\"];\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n textColor,\n fullWidth,\n wrapped,\n icon,\n label,\n selected,\n disabled\n } = ownerState;\n const slots = {\n root: ['root', icon && label && 'labelIcon', `textColor${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(textColor)}`, fullWidth && 'fullWidth', wrapped && 'wrapped', selected && 'selected', disabled && 'disabled'],\n iconWrapper: ['iconWrapper']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _tabClasses__WEBPACK_IMPORTED_MODULE_7__.getTabUtilityClass, classes);\n};\nconst TabRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(_ButtonBase__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n name: 'MuiTab',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.label && ownerState.icon && styles.labelIcon, styles[`textColor${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ownerState.textColor)}`], ownerState.fullWidth && styles.fullWidth, ownerState.wrapped && styles.wrapped];\n }\n})(({\n theme,\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.button, {\n maxWidth: 360,\n minWidth: 90,\n position: 'relative',\n minHeight: 48,\n flexShrink: 0,\n padding: '12px 16px',\n overflow: 'hidden',\n whiteSpace: 'normal',\n textAlign: 'center'\n}, ownerState.label && {\n flexDirection: ownerState.iconPosition === 'top' || ownerState.iconPosition === 'bottom' ? 'column' : 'row'\n}, {\n lineHeight: 1.25\n}, ownerState.icon && ownerState.label && {\n minHeight: 72,\n paddingTop: 9,\n paddingBottom: 9,\n [`& > .${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].iconWrapper}`]: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, ownerState.iconPosition === 'top' && {\n marginBottom: 6\n }, ownerState.iconPosition === 'bottom' && {\n marginTop: 6\n }, ownerState.iconPosition === 'start' && {\n marginRight: theme.spacing(1)\n }, ownerState.iconPosition === 'end' && {\n marginLeft: theme.spacing(1)\n })\n}, ownerState.textColor === 'inherit' && {\n color: 'inherit',\n opacity: 0.6,\n // same opacity as theme.palette.text.secondary\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].selected}`]: {\n opacity: 1\n },\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n opacity: (theme.vars || theme).palette.action.disabledOpacity\n }\n}, ownerState.textColor === 'primary' && {\n color: (theme.vars || theme).palette.text.secondary,\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].selected}`]: {\n color: (theme.vars || theme).palette.primary.main\n },\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.text.disabled\n }\n}, ownerState.textColor === 'secondary' && {\n color: (theme.vars || theme).palette.text.secondary,\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].selected}`]: {\n color: (theme.vars || theme).palette.secondary.main\n },\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.text.disabled\n }\n}, ownerState.fullWidth && {\n flexShrink: 1,\n flexGrow: 1,\n flexBasis: 0,\n maxWidth: 'none'\n}, ownerState.wrapped && {\n fontSize: theme.typography.pxToRem(12)\n}));\nconst Tab = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function Tab(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n props: inProps,\n name: 'MuiTab'\n });\n const {\n className,\n disabled = false,\n disableFocusRipple = false,\n // eslint-disable-next-line react/prop-types\n fullWidth,\n icon: iconProp,\n iconPosition = 'top',\n // eslint-disable-next-line react/prop-types\n indicator,\n label,\n onChange,\n onClick,\n onFocus,\n // eslint-disable-next-line react/prop-types\n selected,\n // eslint-disable-next-line react/prop-types\n selectionFollowsFocus,\n // eslint-disable-next-line react/prop-types\n textColor = 'inherit',\n value,\n wrapped = false\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n disabled,\n disableFocusRipple,\n selected,\n icon: !!iconProp,\n iconPosition,\n label: !!label,\n fullWidth,\n textColor,\n wrapped\n });\n const classes = useUtilityClasses(ownerState);\n const icon = iconProp && label && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.isValidElement(iconProp) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(iconProp, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.iconWrapper, iconProp.props.className)\n }) : iconProp;\n const handleClick = event => {\n if (!selected && onChange) {\n onChange(event, value);\n }\n if (onClick) {\n onClick(event);\n }\n };\n const handleFocus = event => {\n if (selectionFollowsFocus && !selected && onChange) {\n onChange(event, value);\n }\n if (onFocus) {\n onFocus(event);\n }\n };\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(TabRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n focusRipple: !disableFocusRipple,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n ref: ref,\n role: \"tab\",\n \"aria-selected\": selected,\n disabled: disabled,\n onClick: handleClick,\n onFocus: handleFocus,\n ownerState: ownerState,\n tabIndex: selected ? 0 : -1\n }, other, {\n children: [iconPosition === 'top' || iconPosition === 'start' ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {\n children: [icon, label]\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {\n children: [label, icon]\n }), indicator]\n }));\n});\n true ? Tab.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * This prop isn't supported.\n * Use the `component` prop if you need to change the children structure.\n */\n children: _utils_unsupportedProp__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the keyboard focus ripple is disabled.\n * @default false\n */\n disableFocusRipple: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the ripple effect is disabled.\n *\n * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.\n * @default false\n */\n disableRipple: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * The icon to display.\n */\n icon: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_12___default().element), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string)]),\n /**\n * The position of the icon relative to the label.\n * @default 'top'\n */\n iconPosition: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOf(['bottom', 'end', 'start', 'top']),\n /**\n * The label element.\n */\n label: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().node),\n /**\n * @ignore\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * @ignore\n */\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * @ignore\n */\n onFocus: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_12___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_12___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object)]),\n /**\n * You can provide your own value. Otherwise, we fallback to the child position index.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().any),\n /**\n * Tab labels appear in a single row.\n * They can use a second line if needed.\n * @default false\n */\n wrapped: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tab);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tab/Tab.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/Tab/tabClasses.js": +/*!******************************************************!*\ + !*** ./node_modules/@mui/material/Tab/tabClasses.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getTabUtilityClass: () => (/* binding */ getTabUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getTabUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiTab', slot);\n}\nconst tabClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiTab', ['root', 'labelIcon', 'textColorInherit', 'textColorPrimary', 'textColorSecondary', 'selected', 'disabled', 'fullWidth', 'wrapped', 'iconWrapper']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tabClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tab/tabClasses.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/TableBody/TableBody.js": /*!***********************************************************!*\ !*** ./node_modules/@mui/material/TableBody/TableBody.js ***! @@ -1757,6 +1801,39 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/Tabs/ScrollbarSize.js": +/*!**********************************************************!*\ + !*** ./node_modules/@mui/material/Tabs/ScrollbarSize.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ScrollbarSize)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/debounce */ \"./node_modules/@mui/material/utils/debounce.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./node_modules/@mui/material/utils/useEnhancedEffect.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"./node_modules/@mui/material/utils/ownerWindow.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"onChange\"];\n\n\n\n\n\nconst styles = {\n width: 99,\n height: 99,\n position: 'absolute',\n top: -9999,\n overflow: 'scroll'\n};\n\n/**\n * @ignore - internal component.\n * The component originates from https://github.com/STORIS/react-scrollbar-size.\n * It has been moved into the core in order to minimize the bundle size.\n */\nfunction ScrollbarSize(props) {\n const {\n onChange\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, _excluded);\n const scrollbarHeight = react__WEBPACK_IMPORTED_MODULE_2__.useRef();\n const nodeRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const setMeasurements = () => {\n scrollbarHeight.current = nodeRef.current.offsetHeight - nodeRef.current.clientHeight;\n };\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(() => {\n const handleResize = (0,_utils_debounce__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(() => {\n const prevHeight = scrollbarHeight.current;\n setMeasurements();\n if (prevHeight !== scrollbarHeight.current) {\n onChange(scrollbarHeight.current);\n }\n });\n const containerWindow = (0,_utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(nodeRef.current);\n containerWindow.addEventListener('resize', handleResize);\n return () => {\n handleResize.clear();\n containerWindow.removeEventListener('resize', handleResize);\n };\n }, [onChange]);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n setMeasurements();\n onChange(scrollbarHeight.current);\n }, [onChange]);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n style: styles,\n ref: nodeRef\n }, other));\n}\n true ? ScrollbarSize.propTypes = {\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func).isRequired\n} : 0;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tabs/ScrollbarSize.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/Tabs/Tabs.js": +/*!*************************************************!*\ + !*** ./node_modules/@mui/material/Tabs/Tabs.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./node_modules/@mui/material/node_modules/react-is/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/refType.js\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/base/utils/useSlotProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/useTheme */ \"./node_modules/@mui/material/styles/useTheme.js\");\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../utils/debounce */ \"./node_modules/@mui/material/utils/debounce.js\");\n/* harmony import */ var _utils_scrollLeft__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/scrollLeft */ \"./node_modules/@mui/utils/esm/scrollLeft.js\");\n/* harmony import */ var _internal_animate__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../internal/animate */ \"./node_modules/@mui/material/internal/animate.js\");\n/* harmony import */ var _ScrollbarSize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ScrollbarSize */ \"./node_modules/@mui/material/Tabs/ScrollbarSize.js\");\n/* harmony import */ var _TabScrollButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../TabScrollButton */ \"./node_modules/@mui/material/TabScrollButton/TabScrollButton.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./node_modules/@mui/material/utils/useEventCallback.js\");\n/* harmony import */ var _tabsClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tabsClasses */ \"./node_modules/@mui/material/Tabs/tabsClasses.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./node_modules/@mui/material/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./node_modules/@mui/material/utils/ownerWindow.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"aria-label\", \"aria-labelledby\", \"action\", \"centered\", \"children\", \"className\", \"component\", \"allowScrollButtonsMobile\", \"indicatorColor\", \"onChange\", \"orientation\", \"ScrollButtonComponent\", \"scrollButtons\", \"selectionFollowsFocus\", \"slots\", \"slotProps\", \"TabIndicatorProps\", \"TabScrollButtonProps\", \"textColor\", \"value\", \"variant\", \"visibleScrollbar\"];\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst nextItem = (list, item) => {\n if (list === item) {\n return list.firstChild;\n }\n if (item && item.nextElementSibling) {\n return item.nextElementSibling;\n }\n return list.firstChild;\n};\nconst previousItem = (list, item) => {\n if (list === item) {\n return list.lastChild;\n }\n if (item && item.previousElementSibling) {\n return item.previousElementSibling;\n }\n return list.lastChild;\n};\nconst moveFocus = (list, currentFocus, traversalFunction) => {\n let wrappedOnce = false;\n let nextFocus = traversalFunction(list, currentFocus);\n while (nextFocus) {\n // Prevent infinite loop.\n if (nextFocus === list.firstChild) {\n if (wrappedOnce) {\n return;\n }\n wrappedOnce = true;\n }\n\n // Same logic as useAutocomplete.js\n const nextFocusDisabled = nextFocus.disabled || nextFocus.getAttribute('aria-disabled') === 'true';\n if (!nextFocus.hasAttribute('tabindex') || nextFocusDisabled) {\n // Move to the next element.\n nextFocus = traversalFunction(list, nextFocus);\n } else {\n nextFocus.focus();\n return;\n }\n }\n};\nconst useUtilityClasses = ownerState => {\n const {\n vertical,\n fixed,\n hideScrollbar,\n scrollableX,\n scrollableY,\n centered,\n scrollButtonsHideMobile,\n classes\n } = ownerState;\n const slots = {\n root: ['root', vertical && 'vertical'],\n scroller: ['scroller', fixed && 'fixed', hideScrollbar && 'hideScrollbar', scrollableX && 'scrollableX', scrollableY && 'scrollableY'],\n flexContainer: ['flexContainer', vertical && 'flexContainerVertical', centered && 'centered'],\n indicator: ['indicator'],\n scrollButtons: ['scrollButtons', scrollButtonsHideMobile && 'scrollButtonsHideMobile'],\n scrollableX: [scrollableX && 'scrollableX'],\n hideScrollbar: [hideScrollbar && 'hideScrollbar']\n };\n return (0,_mui_base__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _tabsClasses__WEBPACK_IMPORTED_MODULE_7__.getTabsUtilityClass, classes);\n};\nconst TabsRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('div', {\n name: 'MuiTabs',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [{\n [`& .${_tabsClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].scrollButtons}`]: styles.scrollButtons\n }, {\n [`& .${_tabsClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].scrollButtons}`]: ownerState.scrollButtonsHideMobile && styles.scrollButtonsHideMobile\n }, styles.root, ownerState.vertical && styles.vertical];\n }\n})(({\n ownerState,\n theme\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n overflow: 'hidden',\n minHeight: 48,\n // Add iOS momentum scrolling for iOS < 13.0\n WebkitOverflowScrolling: 'touch',\n display: 'flex'\n}, ownerState.vertical && {\n flexDirection: 'column'\n}, ownerState.scrollButtonsHideMobile && {\n [`& .${_tabsClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].scrollButtons}`]: {\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n }\n}));\nconst TabsScroller = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('div', {\n name: 'MuiTabs',\n slot: 'Scroller',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.scroller, ownerState.fixed && styles.fixed, ownerState.hideScrollbar && styles.hideScrollbar, ownerState.scrollableX && styles.scrollableX, ownerState.scrollableY && styles.scrollableY];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n position: 'relative',\n display: 'inline-block',\n flex: '1 1 auto',\n whiteSpace: 'nowrap'\n}, ownerState.fixed && {\n overflowX: 'hidden',\n width: '100%'\n}, ownerState.hideScrollbar && {\n // Hide dimensionless scrollbar on macOS\n scrollbarWidth: 'none',\n // Firefox\n '&::-webkit-scrollbar': {\n display: 'none' // Safari + Chrome\n }\n}, ownerState.scrollableX && {\n overflowX: 'auto',\n overflowY: 'hidden'\n}, ownerState.scrollableY && {\n overflowY: 'auto',\n overflowX: 'hidden'\n}));\nconst FlexContainer = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('div', {\n name: 'MuiTabs',\n slot: 'FlexContainer',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.flexContainer, ownerState.vertical && styles.flexContainerVertical, ownerState.centered && styles.centered];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'flex'\n}, ownerState.vertical && {\n flexDirection: 'column'\n}, ownerState.centered && {\n justifyContent: 'center'\n}));\nconst TabsIndicator = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('span', {\n name: 'MuiTabs',\n slot: 'Indicator',\n overridesResolver: (props, styles) => styles.indicator\n})(({\n ownerState,\n theme\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n position: 'absolute',\n height: 2,\n bottom: 0,\n width: '100%',\n transition: theme.transitions.create()\n}, ownerState.indicatorColor === 'primary' && {\n backgroundColor: (theme.vars || theme).palette.primary.main\n}, ownerState.indicatorColor === 'secondary' && {\n backgroundColor: (theme.vars || theme).palette.secondary.main\n}, ownerState.vertical && {\n height: '100%',\n width: 2,\n right: 0\n}));\nconst TabsScrollbarSize = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(_ScrollbarSize__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n name: 'MuiTabs',\n slot: 'ScrollbarSize'\n})({\n overflowX: 'auto',\n overflowY: 'hidden',\n // Hide dimensionless scrollbar on macOS\n scrollbarWidth: 'none',\n // Firefox\n '&::-webkit-scrollbar': {\n display: 'none' // Safari + Chrome\n }\n});\n\nconst defaultIndicatorStyle = {};\nlet warnedOnceTabPresent = false;\nconst Tabs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function Tabs(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n props: inProps,\n name: 'MuiTabs'\n });\n const theme = (0,_styles_useTheme__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const isRtl = theme.direction === 'rtl';\n const {\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n action,\n centered = false,\n children: childrenProp,\n className,\n component = 'div',\n allowScrollButtonsMobile = false,\n indicatorColor = 'primary',\n onChange,\n orientation = 'horizontal',\n ScrollButtonComponent = _TabScrollButton__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n scrollButtons = 'auto',\n selectionFollowsFocus,\n slots = {},\n slotProps = {},\n TabIndicatorProps = {},\n TabScrollButtonProps = {},\n textColor = 'primary',\n value,\n variant = 'standard',\n visibleScrollbar = false\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const scrollable = variant === 'scrollable';\n const vertical = orientation === 'vertical';\n const scrollStart = vertical ? 'scrollTop' : 'scrollLeft';\n const start = vertical ? 'top' : 'left';\n const end = vertical ? 'bottom' : 'right';\n const clientSize = vertical ? 'clientHeight' : 'clientWidth';\n const size = vertical ? 'height' : 'width';\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n component,\n allowScrollButtonsMobile,\n indicatorColor,\n orientation,\n vertical,\n scrollButtons,\n textColor,\n variant,\n visibleScrollbar,\n fixed: !scrollable,\n hideScrollbar: scrollable && !visibleScrollbar,\n scrollableX: scrollable && !vertical,\n scrollableY: scrollable && vertical,\n centered: centered && !scrollable,\n scrollButtonsHideMobile: !allowScrollButtonsMobile\n });\n const classes = useUtilityClasses(ownerState);\n const startScrollButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: slots.StartScrollButtonIcon,\n externalSlotProps: slotProps.startScrollButtonIcon,\n ownerState\n });\n const endScrollButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: slots.EndScrollButtonIcon,\n externalSlotProps: slotProps.endScrollButtonIcon,\n ownerState\n });\n if (true) {\n if (centered && scrollable) {\n console.error('MUI: You can not use the `centered={true}` and `variant=\"scrollable\"` properties ' + 'at the same time on a `Tabs` component.');\n }\n }\n const [mounted, setMounted] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [indicatorStyle, setIndicatorStyle] = react__WEBPACK_IMPORTED_MODULE_2__.useState(defaultIndicatorStyle);\n const [displayStartScroll, setDisplayStartScroll] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [displayEndScroll, setDisplayEndScroll] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [updateScrollObserver, setUpdateScrollObserver] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [scrollerStyle, setScrollerStyle] = react__WEBPACK_IMPORTED_MODULE_2__.useState({\n overflow: 'hidden',\n scrollbarWidth: 0\n });\n const valueToIndex = new Map();\n const tabsRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const tabListRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const getTabsMeta = () => {\n const tabsNode = tabsRef.current;\n let tabsMeta;\n if (tabsNode) {\n const rect = tabsNode.getBoundingClientRect();\n // create a new object with ClientRect class props + scrollLeft\n tabsMeta = {\n clientWidth: tabsNode.clientWidth,\n scrollLeft: tabsNode.scrollLeft,\n scrollTop: tabsNode.scrollTop,\n scrollLeftNormalized: (0,_utils_scrollLeft__WEBPACK_IMPORTED_MODULE_14__.getNormalizedScrollLeft)(tabsNode, theme.direction),\n scrollWidth: tabsNode.scrollWidth,\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right\n };\n }\n let tabMeta;\n if (tabsNode && value !== false) {\n const children = tabListRef.current.children;\n if (children.length > 0) {\n const tab = children[valueToIndex.get(value)];\n if (true) {\n if (!tab) {\n console.error([`MUI: The \\`value\\` provided to the Tabs component is invalid.`, `None of the Tabs' children match with \"${value}\".`, valueToIndex.keys ? `You can provide one of the following values: ${Array.from(valueToIndex.keys()).join(', ')}.` : null].join('\\n'));\n }\n }\n tabMeta = tab ? tab.getBoundingClientRect() : null;\n if (true) {\n if ( true && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && tabMeta.height === 0 &&\n // if the whole Tabs component is hidden, don't warn\n tabsMeta.clientWidth !== 0) {\n tabsMeta = null;\n console.error(['MUI: The `value` provided to the Tabs component is invalid.', `The Tab with this \\`value\\` (\"${value}\") is not part of the document layout.`, \"Make sure the tab item is present in the document or that it's not `display: none`.\"].join('\\n'));\n warnedOnceTabPresent = true;\n }\n }\n }\n }\n return {\n tabsMeta,\n tabMeta\n };\n };\n const updateIndicatorState = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(() => {\n const {\n tabsMeta,\n tabMeta\n } = getTabsMeta();\n let startValue = 0;\n let startIndicator;\n if (vertical) {\n startIndicator = 'top';\n if (tabMeta && tabsMeta) {\n startValue = tabMeta.top - tabsMeta.top + tabsMeta.scrollTop;\n }\n } else {\n startIndicator = isRtl ? 'right' : 'left';\n if (tabMeta && tabsMeta) {\n const correction = isRtl ? tabsMeta.scrollLeftNormalized + tabsMeta.clientWidth - tabsMeta.scrollWidth : tabsMeta.scrollLeft;\n startValue = (isRtl ? -1 : 1) * (tabMeta[startIndicator] - tabsMeta[startIndicator] + correction);\n }\n }\n const newIndicatorStyle = {\n [startIndicator]: startValue,\n // May be wrong until the font is loaded.\n [size]: tabMeta ? tabMeta[size] : 0\n };\n\n // IE11 support, replace with Number.isNaN\n // eslint-disable-next-line no-restricted-globals\n if (isNaN(indicatorStyle[startIndicator]) || isNaN(indicatorStyle[size])) {\n setIndicatorStyle(newIndicatorStyle);\n } else {\n const dStart = Math.abs(indicatorStyle[startIndicator] - newIndicatorStyle[startIndicator]);\n const dSize = Math.abs(indicatorStyle[size] - newIndicatorStyle[size]);\n if (dStart >= 1 || dSize >= 1) {\n setIndicatorStyle(newIndicatorStyle);\n }\n }\n });\n const scroll = (scrollValue, {\n animation = true\n } = {}) => {\n if (animation) {\n (0,_internal_animate__WEBPACK_IMPORTED_MODULE_16__[\"default\"])(scrollStart, tabsRef.current, scrollValue, {\n duration: theme.transitions.duration.standard\n });\n } else {\n tabsRef.current[scrollStart] = scrollValue;\n }\n };\n const moveTabsScroll = delta => {\n let scrollValue = tabsRef.current[scrollStart];\n if (vertical) {\n scrollValue += delta;\n } else {\n scrollValue += delta * (isRtl ? -1 : 1);\n // Fix for Edge\n scrollValue *= isRtl && (0,_utils_scrollLeft__WEBPACK_IMPORTED_MODULE_14__.detectScrollType)() === 'reverse' ? -1 : 1;\n }\n scroll(scrollValue);\n };\n const getScrollSize = () => {\n const containerSize = tabsRef.current[clientSize];\n let totalSize = 0;\n const children = Array.from(tabListRef.current.children);\n for (let i = 0; i < children.length; i += 1) {\n const tab = children[i];\n if (totalSize + tab[clientSize] > containerSize) {\n // If the first item is longer than the container size, then only scroll\n // by the container size.\n if (i === 0) {\n totalSize = containerSize;\n }\n break;\n }\n totalSize += tab[clientSize];\n }\n return totalSize;\n };\n const handleStartScrollClick = () => {\n moveTabsScroll(-1 * getScrollSize());\n };\n const handleEndScrollClick = () => {\n moveTabsScroll(getScrollSize());\n };\n\n // TODO Remove as browser support for hiding the scrollbar\n // with CSS improves.\n const handleScrollbarSizeChange = react__WEBPACK_IMPORTED_MODULE_2__.useCallback(scrollbarWidth => {\n setScrollerStyle({\n overflow: null,\n scrollbarWidth\n });\n }, []);\n const getConditionalElements = () => {\n const conditionalElements = {};\n conditionalElements.scrollbarSizeListener = scrollable ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(TabsScrollbarSize, {\n onChange: handleScrollbarSizeChange,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.scrollableX, classes.hideScrollbar)\n }) : null;\n const scrollButtonsActive = displayStartScroll || displayEndScroll;\n const showScrollButtons = scrollable && (scrollButtons === 'auto' && scrollButtonsActive || scrollButtons === true);\n conditionalElements.scrollButtonStart = showScrollButtons ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(ScrollButtonComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n slots: {\n StartScrollButtonIcon: slots.StartScrollButtonIcon\n },\n slotProps: {\n startScrollButtonIcon: startScrollButtonIconProps\n },\n orientation: orientation,\n direction: isRtl ? 'right' : 'left',\n onClick: handleStartScrollClick,\n disabled: !displayStartScroll\n }, TabScrollButtonProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.scrollButtons, TabScrollButtonProps.className)\n })) : null;\n conditionalElements.scrollButtonEnd = showScrollButtons ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(ScrollButtonComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n slots: {\n EndScrollButtonIcon: slots.EndScrollButtonIcon\n },\n slotProps: {\n endScrollButtonIcon: endScrollButtonIconProps\n },\n orientation: orientation,\n direction: isRtl ? 'left' : 'right',\n onClick: handleEndScrollClick,\n disabled: !displayEndScroll\n }, TabScrollButtonProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.scrollButtons, TabScrollButtonProps.className)\n })) : null;\n return conditionalElements;\n };\n const scrollSelectedIntoView = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(animation => {\n const {\n tabsMeta,\n tabMeta\n } = getTabsMeta();\n if (!tabMeta || !tabsMeta) {\n return;\n }\n if (tabMeta[start] < tabsMeta[start]) {\n // left side of button is out of view\n const nextScrollStart = tabsMeta[scrollStart] + (tabMeta[start] - tabsMeta[start]);\n scroll(nextScrollStart, {\n animation\n });\n } else if (tabMeta[end] > tabsMeta[end]) {\n // right side of button is out of view\n const nextScrollStart = tabsMeta[scrollStart] + (tabMeta[end] - tabsMeta[end]);\n scroll(nextScrollStart, {\n animation\n });\n }\n });\n const updateScrollButtonState = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(() => {\n if (scrollable && scrollButtons !== false) {\n setUpdateScrollObserver(!updateScrollObserver);\n }\n });\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n const handleResize = (0,_utils_debounce__WEBPACK_IMPORTED_MODULE_17__[\"default\"])(() => {\n // If the Tabs component is replaced by Suspense with a fallback, the last\n // ResizeObserver's handler that runs because of the change in the layout is trying to\n // access a dom node that is no longer there (as the fallback component is being shown instead).\n // See https://github.com/mui/material-ui/issues/33276\n // TODO: Add tests that will ensure the component is not failing when\n // replaced by Suspense with a fallback, once React is updated to version 18\n if (tabsRef.current) {\n updateIndicatorState();\n }\n });\n const win = (0,_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_18__[\"default\"])(tabsRef.current);\n win.addEventListener('resize', handleResize);\n let resizeObserver;\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(handleResize);\n Array.from(tabListRef.current.children).forEach(child => {\n resizeObserver.observe(child);\n });\n }\n return () => {\n handleResize.clear();\n win.removeEventListener('resize', handleResize);\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, [updateIndicatorState]);\n\n /**\n * Toggle visibility of start and end scroll buttons\n * Using IntersectionObserver on first and last Tabs.\n */\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n const tabListChildren = Array.from(tabListRef.current.children);\n const length = tabListChildren.length;\n if (typeof IntersectionObserver !== 'undefined' && length > 0 && scrollable && scrollButtons !== false) {\n const firstTab = tabListChildren[0];\n const lastTab = tabListChildren[length - 1];\n const observerOptions = {\n root: tabsRef.current,\n threshold: 0.99\n };\n const handleScrollButtonStart = entries => {\n setDisplayStartScroll(!entries[0].isIntersecting);\n };\n const firstObserver = new IntersectionObserver(handleScrollButtonStart, observerOptions);\n firstObserver.observe(firstTab);\n const handleScrollButtonEnd = entries => {\n setDisplayEndScroll(!entries[0].isIntersecting);\n };\n const lastObserver = new IntersectionObserver(handleScrollButtonEnd, observerOptions);\n lastObserver.observe(lastTab);\n return () => {\n firstObserver.disconnect();\n lastObserver.disconnect();\n };\n }\n return undefined;\n }, [scrollable, scrollButtons, updateScrollObserver, childrenProp == null ? void 0 : childrenProp.length]);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n setMounted(true);\n }, []);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n updateIndicatorState();\n });\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n // Don't animate on the first render.\n scrollSelectedIntoView(defaultIndicatorStyle !== indicatorStyle);\n }, [scrollSelectedIntoView, indicatorStyle]);\n react__WEBPACK_IMPORTED_MODULE_2__.useImperativeHandle(action, () => ({\n updateIndicator: updateIndicatorState,\n updateScrollButtons: updateScrollButtonState\n }), [updateIndicatorState, updateScrollButtonState]);\n const indicator = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(TabsIndicator, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, TabIndicatorProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.indicator, TabIndicatorProps.className),\n ownerState: ownerState,\n style: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, indicatorStyle, TabIndicatorProps.style)\n }));\n let childIndex = 0;\n const children = react__WEBPACK_IMPORTED_MODULE_2__.Children.map(childrenProp, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.isValidElement(child)) {\n return null;\n }\n if (true) {\n if ((0,react_is__WEBPACK_IMPORTED_MODULE_3__.isFragment)(child)) {\n console.error([\"MUI: The Tabs component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n }\n }\n const childValue = child.props.value === undefined ? childIndex : child.props.value;\n valueToIndex.set(childValue, childIndex);\n const selected = childValue === value;\n childIndex += 1;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(child, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n fullWidth: variant === 'fullWidth',\n indicator: selected && !mounted && indicator,\n selected,\n selectionFollowsFocus,\n onChange,\n textColor,\n value: childValue\n }, childIndex === 1 && value === false && !child.props.tabIndex ? {\n tabIndex: 0\n } : {}));\n });\n const handleKeyDown = event => {\n const list = tabListRef.current;\n const currentFocus = (0,_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_19__[\"default\"])(list).activeElement;\n // Keyboard navigation assumes that [role=\"tab\"] are siblings\n // though we might warn in the future about nested, interactive elements\n // as a a11y violation\n const role = currentFocus.getAttribute('role');\n if (role !== 'tab') {\n return;\n }\n let previousItemKey = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n let nextItemKey = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n if (orientation === 'horizontal' && isRtl) {\n // swap previousItemKey with nextItemKey\n previousItemKey = 'ArrowRight';\n nextItemKey = 'ArrowLeft';\n }\n switch (event.key) {\n case previousItemKey:\n event.preventDefault();\n moveFocus(list, currentFocus, previousItem);\n break;\n case nextItemKey:\n event.preventDefault();\n moveFocus(list, currentFocus, nextItem);\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(list, null, nextItem);\n break;\n case 'End':\n event.preventDefault();\n moveFocus(list, null, previousItem);\n break;\n default:\n break;\n }\n };\n const conditionalElements = getConditionalElements();\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(TabsRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n ownerState: ownerState,\n ref: ref,\n as: component\n }, other, {\n children: [conditionalElements.scrollButtonStart, conditionalElements.scrollbarSizeListener, /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(TabsScroller, {\n className: classes.scroller,\n ownerState: ownerState,\n style: {\n overflow: scrollerStyle.overflow,\n [vertical ? `margin${isRtl ? 'Left' : 'Right'}` : 'marginBottom']: visibleScrollbar ? undefined : -scrollerStyle.scrollbarWidth\n },\n ref: tabsRef,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(FlexContainer, {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-orientation\": orientation === 'vertical' ? 'vertical' : null,\n className: classes.flexContainer,\n ownerState: ownerState,\n onKeyDown: handleKeyDown,\n ref: tabListRef,\n role: \"tablist\",\n children: children\n }), mounted && indicator]\n }), conditionalElements.scrollButtonEnd]\n }));\n});\n true ? Tabs.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * Callback fired when the component mounts.\n * This is useful when you want to trigger an action programmatically.\n * It supports two actions: `updateIndicator()` and `updateScrollButtons()`\n *\n * @param {object} actions This object contains all possible actions\n * that can be triggered programmatically.\n */\n action: _mui_utils__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n /**\n * If `true`, the scroll buttons aren't forced hidden on mobile.\n * By default the scroll buttons are hidden on mobile and takes precedence over `scrollButtons`.\n * @default false\n */\n allowScrollButtonsMobile: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool),\n /**\n * The label for the Tabs as a string.\n */\n 'aria-label': (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string),\n /**\n * An id or list of ids separated by a space that label the Tabs.\n */\n 'aria-labelledby': (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string),\n /**\n * If `true`, the tabs are centered.\n * This prop is intended for large views.\n * @default false\n */\n centered: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool),\n /**\n * The content of the component.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().node),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string),\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType),\n /**\n * Determines the color of the indicator.\n * @default 'primary'\n */\n indicatorColor: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['primary', 'secondary']), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string)]),\n /**\n * Callback fired when the value changes.\n *\n * @param {React.SyntheticEvent} event The event source of the callback. **Warning**: This is a generic event not a change event.\n * @param {any} value We default to the index of the child (number)\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().func),\n /**\n * The component orientation (layout flow direction).\n * @default 'horizontal'\n */\n orientation: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['horizontal', 'vertical']),\n /**\n * The component used to render the scroll buttons.\n * @default TabScrollButton\n */\n ScrollButtonComponent: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType),\n /**\n * Determine behavior of scroll buttons when tabs are set to scroll:\n *\n * - `auto` will only present them when not all the items are visible.\n * - `true` will always present them.\n * - `false` will never present them.\n *\n * By default the scroll buttons are hidden on mobile.\n * This behavior can be disabled with `allowScrollButtonsMobile`.\n * @default 'auto'\n */\n scrollButtons: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['auto', false, true]),\n /**\n * If `true` the selected tab changes on focus. Otherwise it only\n * changes on activation.\n */\n selectionFollowsFocus: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool),\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n * @default {}\n */\n slotProps: prop_types__WEBPACK_IMPORTED_MODULE_21___default().shape({\n endScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object)]),\n startScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object)])\n }),\n /**\n * The components used for each slot inside.\n * @default {}\n */\n slots: prop_types__WEBPACK_IMPORTED_MODULE_21___default().shape({\n EndScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType),\n StartScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType)\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_21___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object)]),\n /**\n * Props applied to the tab indicator element.\n * @default {}\n */\n TabIndicatorProps: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object),\n /**\n * Props applied to the [`TabScrollButton`](/material-ui/api/tab-scroll-button/) element.\n * @default {}\n */\n TabScrollButtonProps: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object),\n /**\n * Determines the color of the `Tab`.\n * @default 'primary'\n */\n textColor: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['inherit', 'primary', 'secondary']),\n /**\n * The value of the currently selected `Tab`.\n * If you don't want any selected `Tab`, you can set this prop to `false`.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().any),\n /**\n * Determines additional display behavior of the tabs:\n *\n * - `scrollable` will invoke scrolling properties and allow for horizontally\n * scrolling (or swiping) of the tab bar.\n * -`fullWidth` will make the tabs grow to use all the available space,\n * which should be used for small views, like on mobile.\n * - `standard` will render the default state.\n * @default 'standard'\n */\n variant: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['fullWidth', 'scrollable', 'standard']),\n /**\n * If `true`, the scrollbar is visible. It can be useful when displaying\n * a long vertical list of tabs.\n * @default false\n */\n visibleScrollbar: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tabs);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tabs/Tabs.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/Tabs/tabsClasses.js": +/*!********************************************************!*\ + !*** ./node_modules/@mui/material/Tabs/tabsClasses.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getTabsUtilityClass: () => (/* binding */ getTabsUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getTabsUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiTabs', slot);\n}\nconst tabsClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiTabs', ['root', 'vertical', 'flexContainer', 'flexContainerVertical', 'centered', 'scroller', 'fixed', 'scrollableX', 'scrollableY', 'hideScrollbar', 'scrollButtons', 'scrollButtonsHideMobile', 'indicator']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tabsClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tabs/tabsClasses.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/TextField/TextField.js": /*!***********************************************************!*\ !*** ./node_modules/@mui/material/TextField/TextField.js ***! @@ -1911,6 +1988,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/internal/animate.js": +/*!********************************************************!*\ + !*** ./node_modules/@mui/material/internal/animate.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ animate)\n/* harmony export */ });\nfunction easeInOutSin(time) {\n return (1 + Math.sin(Math.PI * time - Math.PI / 2)) / 2;\n}\nfunction animate(property, element, to, options = {}, cb = () => {}) {\n const {\n ease = easeInOutSin,\n duration = 300 // standard\n } = options;\n let start = null;\n const from = element[property];\n let cancelled = false;\n const cancel = () => {\n cancelled = true;\n };\n const step = timestamp => {\n if (cancelled) {\n cb(new Error('Animation cancelled'));\n return;\n }\n if (start === null) {\n start = timestamp;\n }\n const time = Math.min(1, (timestamp - start) / duration);\n element[property] = ease(time) * (to - from) + from;\n if (time >= 1) {\n requestAnimationFrame(() => {\n cb(null);\n });\n return;\n }\n requestAnimationFrame(step);\n };\n if (from === to) {\n cb(new Error('Element already at target position'));\n return cancel;\n }\n requestAnimationFrame(step);\n return cancel;\n}\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/animate.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/internal/svg-icons/ArrowDropDown.js": /*!************************************************************************!*\ !*** ./node_modules/@mui/material/internal/svg-icons/ArrowDropDown.js ***! @@ -1933,6 +2021,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"\n}), 'KeyboardArrowLeft'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"\n}), 'KeyboardArrowRight'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/node_modules/react-is/cjs/react-is.development.js": /*!**************************************************************************************!*\ !*** ./node_modules/@mui/material/node_modules/react-is/cjs/react-is.development.js ***! @@ -2879,6 +2989,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/utils/esm/scrollLeft.js": +/*!***************************************************!*\ + !*** ./node_modules/@mui/utils/esm/scrollLeft.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ detectScrollType: () => (/* binding */ detectScrollType),\n/* harmony export */ getNormalizedScrollLeft: () => (/* binding */ getNormalizedScrollLeft)\n/* harmony export */ });\n// Source from https://github.com/alitaheri/normalize-scroll-left\nlet cachedType;\n\n/**\n * Based on the jquery plugin https://github.com/othree/jquery.rtl-scroll-type\n *\n * Types of scrollLeft, assuming scrollWidth=100 and direction is rtl.\n *\n * Type | <- Most Left | Most Right -> | Initial\n * ---------------- | ------------ | ------------- | -------\n * default | 0 | 100 | 100\n * negative (spec*) | -100 | 0 | 0\n * reverse | 100 | 0 | 0\n *\n * Edge 85: default\n * Safari 14: negative\n * Chrome 85: negative\n * Firefox 81: negative\n * IE11: reverse\n *\n * spec* https://drafts.csswg.org/cssom-view/#dom-window-scroll\n */\nfunction detectScrollType() {\n if (cachedType) {\n return cachedType;\n }\n const dummy = document.createElement('div');\n const container = document.createElement('div');\n container.style.width = '10px';\n container.style.height = '1px';\n dummy.appendChild(container);\n dummy.dir = 'rtl';\n dummy.style.fontSize = '14px';\n dummy.style.width = '4px';\n dummy.style.height = '1px';\n dummy.style.position = 'absolute';\n dummy.style.top = '-1000px';\n dummy.style.overflow = 'scroll';\n document.body.appendChild(dummy);\n cachedType = 'reverse';\n if (dummy.scrollLeft > 0) {\n cachedType = 'default';\n } else {\n dummy.scrollLeft = 1;\n if (dummy.scrollLeft === 0) {\n cachedType = 'negative';\n }\n }\n document.body.removeChild(dummy);\n return cachedType;\n}\n\n// Based on https://stackoverflow.com/a/24394376\nfunction getNormalizedScrollLeft(element, direction) {\n const scrollLeft = element.scrollLeft;\n\n // Perform the calculations only when direction is rtl to avoid messing up the ltr behavior\n if (direction !== 'rtl') {\n return scrollLeft;\n }\n const type = detectScrollType();\n switch (type) {\n case 'negative':\n return element.scrollWidth - element.clientWidth + scrollLeft;\n case 'reverse':\n return element.scrollWidth - element.clientWidth - scrollLeft;\n default:\n return scrollLeft;\n }\n}\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/utils/esm/scrollLeft.js?"); + +/***/ }), + /***/ "./node_modules/@mui/utils/esm/setRef.js": /*!***********************************************!*\ !*** ./node_modules/@mui/utils/esm/setRef.js ***! @@ -3040,7 +3161,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ App: () => (/* binding */ App)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_app_error_page */ \"./app/components/p8p_app_error_page.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config_wrapper */ \"./app/config_wrapper.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Роутер\n //Контекст приложения\n //Контекст навигации\n //Страница с ошибкой\n //Рабочее пространство панели\n //Меню панелей\n //Текстовые ресурсы и константы\n //Подключение компонентов к настройкам приложения\n\n//--------------------------\n//Вспомогательные компоненты\n//--------------------------\n\n//Обработка ошибок роутинга\nconst RouterError = ({\n homePath\n}) => {\n //Подключение к контексту навигации\n const {\n navigateTo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Извлечем ошибку роутинга\n const routeError = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useRouteError)();\n\n //Отработка нажатия на кнопку навигации\n const handleNavigate = () => navigateTo({\n path: `${homePath.startsWith(\"/\") ? \"\" : \"/\"}${homePath}`\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__.P8PAppErrorPage, {\n errorMessage: _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] ? _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] : _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS.DEFAULT,\n onNavigate: handleNavigate,\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_6__.BUTTONS.NAVIGATE_HOME\n });\n};\n\n//Контроль свойств - обработка ошибок роутинга\nRouterError.propTypes = {\n homePath: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired\n};\n\n//Главное меню приложения\nconst MainMenu = ({\n panels = []\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigatePanel,\n isNavigationSearch,\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Подключение к контексту приложения\n const {\n configUrlBase,\n pOnlineShowTab\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Получим параметры запроса из адресной строки\n const qS = isNavigationSearch() ? getNavigationSearch() : null;\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = (panel, newTab) => newTab ? pOnlineShowTab({\n id: panel.name,\n url: `${configUrlBase}${panel.url}`,\n caption: panel.caption\n }) : navigatePanel(panel);\n\n //Генерация содержимого\n return qS?.mode === \"DESKTOP\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuDesktop, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n group: qS?.group,\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, true)\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, false)\n }));\n};\n\n//Контроль свойств - главное меню приложения\nMainMenu.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired\n};\n\n//Рабочее пространство панели\nconst Workspace = ({\n panels = [],\n selectedPanel,\n children\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigateRoot,\n navigatePanel\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Отработка действия навигации домой\n const handleHomeNavigate = () => navigateRoot();\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = panel => navigatePanel(panel);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_APP_WORKSPACE_CONFIG_PROPS, {\n panels: panels,\n selectedPanel: selectedPanel,\n onHomeNavigate: handleHomeNavigate,\n onItemNavigate: handleItemNavigate\n }), children);\n};\n\n//Контроль свойств - главное меню приложения\nWorkspace.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE,\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//Обёртывание элемента в контекст навигации\nconst wrapNavigationContext = children => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationContext, null, children);\n\n//-----------\n//Тело модуля\n//-----------\n\n//Приложение\nconst App = () => {\n //Собственное состояние\n const [routes, setRoutes] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Подключение к контексту приложения\n const {\n appState\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Инициализация роутера\n const content = routes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_8__.RouterProvider, {\n router: (0,react_router_dom__WEBPACK_IMPORTED_MODULE_10__.createHashRouter)(routes)\n }) : null;\n\n //При изменении состояния загрузки панелей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (appState.panelsLoaded) {\n //Сборка \"веток\" для панелей\n let routes = [{\n path: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)(),\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenu, {\n panels: appState.panels\n })),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)()\n }))\n }];\n for (const panel of appState.panels) {\n // eslint-disable-next-line no-undef\n const p = __webpack_require__(\"./app/panels sync recursive ^\\\\.\\\\/.*$\")(`./${panel.path}`);\n routes.push({\n path: `${panel.url}/*`,\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Workspace, {\n panels: appState.panels,\n selectedPanel: panel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(p.RootClass, null))),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: panel.url\n }))\n });\n }\n setRoutes(routes);\n }\n }, [appState.panels, appState.panelsLoaded]);\n\n //Генерация содержимого\n return content;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/app.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ App: () => (/* binding */ App)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_app_error_page */ \"./app/components/p8p_app_error_page.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config_wrapper */ \"./app/config_wrapper.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Приложение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Роутер\n //Контекст приложения\n //Контекст навигации\n //Страница с ошибкой\n //Рабочее пространство панели\n //Меню панелей\n //Текстовые ресурсы и константы\n //Подключение компонентов к настройкам приложения\n\n//--------------------------\n//Вспомогательные компоненты\n//--------------------------\n\n//Обработка ошибок роутинга\nconst RouterError = ({\n homePath\n}) => {\n //Подключение к контексту навигации\n const {\n navigateTo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Извлечем ошибку роутинга\n const routeError = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useRouteError)();\n\n //Отработка нажатия на кнопку навигации\n const handleNavigate = () => navigateTo({\n path: `${homePath.startsWith(\"/\") ? \"\" : \"/\"}${homePath}`\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__.P8PAppErrorPage, {\n errorMessage: _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] ? _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] : _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS.DEFAULT,\n onNavigate: handleNavigate,\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_6__.BUTTONS.NAVIGATE_HOME\n });\n};\n\n//Контроль свойств - обработка ошибок роутинга\nRouterError.propTypes = {\n homePath: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired\n};\n\n//Главное меню приложения\nconst MainMenu = ({\n panels = []\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigatePanel,\n isNavigationSearch,\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Подключение к контексту приложения\n const {\n configUrlBase,\n pOnlineShowTab\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Получим параметры запроса из адресной строки\n const qS = isNavigationSearch() ? getNavigationSearch() : null;\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = (panel, newTab) => newTab ? pOnlineShowTab({\n id: panel.name,\n url: `${configUrlBase}${panel.url}`,\n caption: panel.caption\n }) : navigatePanel(panel);\n\n //Генерация содержимого\n return qS?.mode === \"DESKTOP\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuDesktop, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n group: qS?.group,\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, true)\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, false)\n }));\n};\n\n//Контроль свойств - главное меню приложения\nMainMenu.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired\n};\n\n//Рабочее пространство панели\nconst Workspace = ({\n panels = [],\n selectedPanel,\n children\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigateRoot,\n navigatePanel\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Отработка действия навигации домой\n const handleHomeNavigate = () => navigateRoot();\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = panel => navigatePanel(panel);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_APP_WORKSPACE_CONFIG_PROPS, {\n panels: panels,\n selectedPanel: selectedPanel,\n onHomeNavigate: handleHomeNavigate,\n onItemNavigate: handleItemNavigate\n }), children);\n};\n\n//Контроль свойств - главное меню приложения\nWorkspace.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE,\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//Обёртывание элемента в контекст навигации\nconst wrapNavigationContext = children => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationContext, null, children);\n\n//-----------\n//Тело модуля\n//-----------\n\n//Приложение\nconst App = () => {\n //Собственное состояние\n const [routes, setRoutes] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Подключение к контексту приложения\n const {\n appState\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Инициализация роутера\n const content = routes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_8__.RouterProvider, {\n router: (0,react_router_dom__WEBPACK_IMPORTED_MODULE_10__.createHashRouter)(routes)\n }) : null;\n\n //При изменении состояния загрузки панелей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (appState.panelsLoaded) {\n //Сборка \"веток\" для панелей\n let routes = [{\n path: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)(),\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenu, {\n panels: appState.panels\n })),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)()\n }))\n }];\n for (const panel of appState.panels) {\n // eslint-disable-next-line no-undef\n const p = __webpack_require__(\"./app/panels sync recursive ^\\\\.\\\\/.*$\")(`./${panel.path}`);\n routes.push({\n path: `${panel.url}/*`,\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Workspace, {\n panels: appState.panels,\n selectedPanel: panel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(p.RootClass, null))),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: panel.url\n }))\n });\n }\n setRoutes(routes);\n }\n }, [appState.panels, appState.panelsLoaded]);\n\n //Генерация содержимого\n return content;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/app.js?"); /***/ }), @@ -3051,7 +3172,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppErrorPage: () => (/* binding */ P8PAppErrorPage)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Страница ошибки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Контейнер\n //Сообщения\n\n//-----------\n//Тело модуля\n//-----------\n\n//Страница ошибки\nconst P8PAppErrorPage = ({\n errorMessage,\n onNavigate,\n navigateCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: errorMessage,\n okBtn: onNavigate ? true : false,\n onOk: onNavigate,\n okBtnCaption: navigateCaption\n })));\n};\n\n//Контроль свойств - Страница ошибки\nP8PAppErrorPage.propTypes = {\n errorMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_error_page.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppErrorPage: () => (/* binding */ P8PAppErrorPage)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Страница ошибки\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Контейнер\n //Сообщения\n\n//-----------\n//Тело модуля\n//-----------\n\n//Страница ошибки\nconst P8PAppErrorPage = ({\n errorMessage,\n onNavigate,\n navigateCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: errorMessage,\n okBtn: onNavigate ? true : false,\n onOk: onNavigate,\n okBtnCaption: navigateCaption\n })));\n};\n\n//Контроль свойств - Страница ошибки\nP8PAppErrorPage.propTypes = {\n errorMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_error_page.js?"); /***/ }), @@ -3062,7 +3183,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppInlineError: () => (/* binding */ P8PAppInlineError),\n/* harmony export */ P8PAppInlineInfo: () => (/* binding */ P8PAppInlineInfo),\n/* harmony export */ P8PAppInlineMessage: () => (/* binding */ P8PAppInlineMessage),\n/* harmony export */ P8PAppInlineWarn: () => (/* binding */ P8PAppInlineWarn),\n/* harmony export */ P8PAppMessage: () => (/* binding */ P8PAppMessage),\n/* harmony export */ P8PAppMessageErr: () => (/* binding */ P8PAppMessageErr),\n/* harmony export */ P8PAppMessageInfo: () => (/* binding */ P8PAppMessageInfo),\n/* harmony export */ P8PAppMessageWarn: () => (/* binding */ P8PAppMessageWarn),\n/* harmony export */ P8P_APP_MESSAGE_VARIANT: () => (/* binding */ P8P_APP_MESSAGE_VARIANT)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogActions */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material/Typography */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/Button */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material_Container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material/Container */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material/Box */ \"./node_modules/@mui/material/Box/Box.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Сообщение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Область действий диалога\n //Текст\n //Кнопки\n //Контейнер\n //Обёртка\n\n//---------\n//Константы\n//---------\n\n//Варианты исполнения\nconst P8P_APP_MESSAGE_VARIANT = {\n INFO: \"information\",\n WARN: \"warning\",\n ERR: \"error\"\n};\n\n//Стили\nconst STYLES = {\n DEFAULT: {\n wordBreak: \"break-word\"\n },\n INFO: {\n titleText: {},\n bodyText: {}\n },\n WARN: {\n titleText: {\n color: \"orange\"\n },\n bodyText: {\n color: \"orange\"\n }\n },\n ERR: {\n titleText: {\n color: \"red\"\n },\n bodyText: {\n color: \"red\"\n }\n },\n INLINE_MESSAGE: {\n with: \"100%\",\n textAlign: \"center\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Сообщение\nconst P8PAppMessage = ({\n variant,\n title,\n titleText,\n cancelBtn,\n onCancel,\n cancelBtnCaption,\n okBtn,\n onOk,\n okBtnCaption,\n open,\n text\n}) => {\n //Подбор стиля и ресурсов\n let style = STYLES.INFO;\n switch (variant) {\n case P8P_APP_MESSAGE_VARIANT.INFO:\n {\n style = STYLES.INFO;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.WARN:\n {\n style = STYLES.WARN;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.ERR:\n {\n style = STYLES.ERR;\n break;\n }\n }\n\n //Заголовок\n let titlePart;\n if (title && titleText) titlePart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: \"message-dialog-title\",\n style: {\n ...style.DEFAULT,\n ...style.titleText\n }\n }, titleText);\n\n //Кнопка Отмена\n let cancelBtnPart;\n if (cancelBtn && cancelBtnCaption && variant === P8P_APP_MESSAGE_VARIANT.WARN) cancelBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, cancelBtnCaption);\n\n //Кнопка OK\n let okBtnPart;\n if (okBtn && okBtnCaption) okBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption);\n\n //Все действия\n let actionsPart;\n if (cancelBtnPart || okBtnPart) actionsPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, okBtnPart, cancelBtnPart);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"message-dialog-title\",\n \"aria-describedby\": \"message-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, titlePart, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n id: \"message-dialog-description\",\n style: style.bodyText\n }, text)), actionsPart);\n};\n\n//Контроль свойств - Сообщение\nP8PAppMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n titleText: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n cancelBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n open: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Встроенное сообщение\nconst P8PAppInlineMessage = ({\n variant,\n text,\n okBtn,\n onOk,\n okBtnCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n style: STYLES.INLINE_MESSAGE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: variant === P8P_APP_MESSAGE_VARIANT.ERR ? \"error\" : variant === P8P_APP_MESSAGE_VARIANT.WARN ? \"primary\" : \"textSecondary\"\n }, text), okBtn && okBtnCaption ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption)) : null));\n};\n\n//Контроль свойств - Встроенное сообщение\nP8PAppInlineMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Формирование типового сообщения\nconst buildVariantMessage = (props, variant) => {\n //Извлекаем необходимые свойства\n let {\n open,\n titleText\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppMessage, _extends({}, props, {\n variant: variant,\n open: open === undefined ? true : open,\n title: titleText ? true : false,\n okBtn: true\n }));\n};\n\n//Формирование типового встроенного сообщения\nconst buildVariantInlineMessage = (props, variant) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppInlineMessage, _extends({}, props, {\n variant: variant\n }));\n};\n\n//Сообщение об ошибке\nconst P8PAppMessageErr = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Сообщение предупреждения\nconst P8PAppMessageWarn = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Сообщение информации\nconst P8PAppMessageInfo = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//Встраиваемое сообщение об ошибке\nconst P8PAppInlineError = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Встраиваемое cообщение предупреждения\nconst P8PAppInlineWarn = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Встраиваемое сообщение информации\nconst P8PAppInlineInfo = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_message.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppInlineError: () => (/* binding */ P8PAppInlineError),\n/* harmony export */ P8PAppInlineInfo: () => (/* binding */ P8PAppInlineInfo),\n/* harmony export */ P8PAppInlineMessage: () => (/* binding */ P8PAppInlineMessage),\n/* harmony export */ P8PAppInlineWarn: () => (/* binding */ P8PAppInlineWarn),\n/* harmony export */ P8PAppMessage: () => (/* binding */ P8PAppMessage),\n/* harmony export */ P8PAppMessageErr: () => (/* binding */ P8PAppMessageErr),\n/* harmony export */ P8PAppMessageInfo: () => (/* binding */ P8PAppMessageInfo),\n/* harmony export */ P8PAppMessageWarn: () => (/* binding */ P8PAppMessageWarn),\n/* harmony export */ P8P_APP_MESSAGE_VARIANT: () => (/* binding */ P8P_APP_MESSAGE_VARIANT)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogActions */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material/Typography */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/Button */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material_Container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material/Container */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material/Box */ \"./node_modules/@mui/material/Box/Box.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Компонент: Сообщение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Область действий диалога\n //Текст\n //Кнопки\n //Контейнер\n //Обёртка\n\n//---------\n//Константы\n//---------\n\n//Варианты исполнения\nconst P8P_APP_MESSAGE_VARIANT = {\n INFO: \"information\",\n WARN: \"warning\",\n ERR: \"error\"\n};\n\n//Стили\nconst STYLES = {\n DEFAULT: {\n wordBreak: \"break-word\"\n },\n INFO: {\n titleText: {},\n bodyText: {}\n },\n WARN: {\n titleText: {\n color: \"orange\"\n },\n bodyText: {\n color: \"orange\"\n }\n },\n ERR: {\n titleText: {\n color: \"red\"\n },\n bodyText: {\n color: \"red\"\n }\n },\n INLINE_MESSAGE: {\n with: \"100%\",\n textAlign: \"center\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Сообщение\nconst P8PAppMessage = ({\n variant,\n title,\n titleText,\n cancelBtn,\n onCancel,\n cancelBtnCaption,\n okBtn,\n onOk,\n okBtnCaption,\n open,\n text\n}) => {\n //Подбор стиля и ресурсов\n let style = STYLES.INFO;\n switch (variant) {\n case P8P_APP_MESSAGE_VARIANT.INFO:\n {\n style = STYLES.INFO;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.WARN:\n {\n style = STYLES.WARN;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.ERR:\n {\n style = STYLES.ERR;\n break;\n }\n }\n\n //Заголовок\n let titlePart;\n if (title && titleText) titlePart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: \"message-dialog-title\",\n style: {\n ...style.DEFAULT,\n ...style.titleText\n }\n }, titleText);\n\n //Кнопка Отмена\n let cancelBtnPart;\n if (cancelBtn && cancelBtnCaption && variant === P8P_APP_MESSAGE_VARIANT.WARN) cancelBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, cancelBtnCaption);\n\n //Кнопка OK\n let okBtnPart;\n if (okBtn && okBtnCaption) okBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption);\n\n //Все действия\n let actionsPart;\n if (cancelBtnPart || okBtnPart) actionsPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, okBtnPart, cancelBtnPart);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"message-dialog-title\",\n \"aria-describedby\": \"message-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, titlePart, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n id: \"message-dialog-description\",\n style: style.bodyText\n }, text)), actionsPart);\n};\n\n//Контроль свойств - Сообщение\nP8PAppMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n titleText: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n cancelBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n open: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Встроенное сообщение\nconst P8PAppInlineMessage = ({\n variant,\n text,\n okBtn,\n onOk,\n okBtnCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n style: STYLES.INLINE_MESSAGE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: variant === P8P_APP_MESSAGE_VARIANT.ERR ? \"error\" : variant === P8P_APP_MESSAGE_VARIANT.WARN ? \"primary\" : \"textSecondary\"\n }, text), okBtn && okBtnCaption ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption)) : null));\n};\n\n//Контроль свойств - Встроенное сообщение\nP8PAppInlineMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Формирование типового сообщения\nconst buildVariantMessage = (props, variant) => {\n //Извлекаем необходимые свойства\n let {\n open,\n titleText\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppMessage, _extends({}, props, {\n variant: variant,\n open: open === undefined ? true : open,\n title: titleText ? true : false,\n okBtn: true\n }));\n};\n\n//Формирование типового встроенного сообщения\nconst buildVariantInlineMessage = (props, variant) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppInlineMessage, _extends({}, props, {\n variant: variant\n }));\n};\n\n//Сообщение об ошибке\nconst P8PAppMessageErr = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Сообщение предупреждения\nconst P8PAppMessageWarn = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Сообщение информации\nconst P8PAppMessageInfo = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//Встраиваемое сообщение об ошибке\nconst P8PAppInlineError = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Встраиваемое cообщение предупреждения\nconst P8PAppInlineWarn = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Встраиваемое сообщение информации\nconst P8PAppInlineInfo = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_message.js?"); /***/ }), @@ -3073,7 +3194,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppProgress: () => (/* binding */ P8PAppProgress)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/LinearProgress */ \"./node_modules/@mui/material/LinearProgress/LinearProgress.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Индикатор процесса\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Индикатор\n\n//-----------\n//Тело модуля\n//-----------\n\n//Индикатора прогресса\nconst P8PAppProgress = props => {\n //Извлекаем необходимые свойства\n let {\n open,\n title,\n text\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"progress-dialog-title\",\n \"aria-describedby\": \"progress-dialog-description\"\n }, title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: \"progress-dialog-title\"\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: \"progress-dialog-description\"\n }, text), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null))));\n};\n\n//Контроль свойств - Индикатора прогресса\nP8PAppProgress.propTypes = {\n open: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_progress.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppProgress: () => (/* binding */ P8PAppProgress)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/LinearProgress */ \"./node_modules/@mui/material/LinearProgress/LinearProgress.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Индикатор процесса\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Индикатор\n\n//-----------\n//Тело модуля\n//-----------\n\n//Индикатора прогресса\nconst P8PAppProgress = props => {\n //Извлекаем необходимые свойства\n let {\n open,\n title,\n text\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"progress-dialog-title\",\n \"aria-describedby\": \"progress-dialog-description\"\n }, title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: \"progress-dialog-title\"\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: \"progress-dialog-description\"\n }, text), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null))));\n};\n\n//Контроль свойств - Индикатора прогресса\nP8PAppProgress.propTypes = {\n open: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_progress.js?"); /***/ }), @@ -3084,7 +3205,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppWorkspace: () => (/* binding */ P8PAppWorkspace)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CssBaseline/CssBaseline.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Рабочее пространство\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n ROOT_BOX: {\n display: \"flex\"\n },\n APP_BAR: {\n position: \"fixed\"\n },\n APP_BAR_BUTTON: {\n mr: 2\n },\n MAIN: {\n flexGrow: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Рабочее пространство\nconst P8PAppWorkspace = ({\n children,\n panels = [],\n selectedPanel,\n closeCaption,\n homeCaption,\n onHomeNavigate,\n onItemNavigate\n} = {}) => {\n //Собственное состояния\n const [open, setOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Отработка открытия бокового меню\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n //Отработка закрытия бового меню\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n //Отработка нажатия на домашнюю страницу\n const handleHomeClick = () => onHomeNavigate ? onHomeNavigate() : null;\n\n //Отработка нажатия на элемент бокового меню\n const handleItemNavigate = panel => {\n handleDrawerClose();\n onItemNavigate ? onItemNavigate(panel) : null;\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.ROOT_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n color: \"inherit\",\n \"aria-label\": \"open drawer\",\n onClick: open ? handleDrawerClose : handleDrawerOpen,\n edge: \"start\",\n sx: STYLES.APP_BAR_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, open ? \"chevron_left\" : \"menu\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\",\n noWrap: true,\n component: \"div\"\n }, selectedPanel?.caption))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n anchor: \"left\",\n open: open,\n onClose: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: closeCaption\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleHomeClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"home\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: homeCaption\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8PPanelsMenuDrawer, {\n panels: panels,\n selectedPanel: selectedPanel,\n onItemNavigate: handleItemNavigate\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"main\", {\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), children));\n};\n\n//Контроль свойств - Рабочее пространство\nP8PAppWorkspace.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().element),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE,\n closeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n homeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n onHomeNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_workspace.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppWorkspace: () => (/* binding */ P8PAppWorkspace)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CssBaseline/CssBaseline.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Рабочее пространство\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n ROOT_BOX: {\n display: \"flex\"\n },\n APP_BAR: {\n position: \"fixed\"\n },\n APP_BAR_BUTTON: {\n mr: 2\n },\n MAIN: {\n flexGrow: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Рабочее пространство\nconst P8PAppWorkspace = ({\n children,\n panels = [],\n selectedPanel,\n closeCaption,\n homeCaption,\n onHomeNavigate,\n onItemNavigate\n} = {}) => {\n //Собственное состояния\n const [open, setOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Отработка открытия бокового меню\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n //Отработка закрытия бового меню\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n //Отработка нажатия на домашнюю страницу\n const handleHomeClick = () => onHomeNavigate ? onHomeNavigate() : null;\n\n //Отработка нажатия на элемент бокового меню\n const handleItemNavigate = panel => {\n handleDrawerClose();\n onItemNavigate ? onItemNavigate(panel) : null;\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.ROOT_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n color: \"inherit\",\n \"aria-label\": \"open drawer\",\n onClick: open ? handleDrawerClose : handleDrawerOpen,\n edge: \"start\",\n sx: STYLES.APP_BAR_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, open ? \"chevron_left\" : \"menu\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\",\n noWrap: true,\n component: \"div\"\n }, selectedPanel?.caption))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n anchor: \"left\",\n open: open,\n onClose: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: closeCaption\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleHomeClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"home\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: homeCaption\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8PPanelsMenuDrawer, {\n panels: panels,\n selectedPanel: selectedPanel,\n onItemNavigate: handleItemNavigate\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"main\", {\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), children));\n};\n\n//Контроль свойств - Рабочее пространство\nP8PAppWorkspace.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().element),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE,\n closeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n homeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n onHomeNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_workspace.js?"); /***/ }), @@ -3095,7 +3216,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PChart: () => (/* binding */ P8PChart),\n/* harmony export */ P8P_CHART_TYPE: () => (/* binding */ P8P_CHART_TYPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js/auto */ \"./node_modules/chart.js/auto/auto.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: График\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Диаграммы и графики\n\n//---------\n//Константы\n//---------\n\n//Виды графиков\nconst P8P_CHART_TYPE = {\n BAR: \"bar\",\n LINE: \"line\",\n PIE: \"pie\",\n DOUGHNUT: \"doughnut\"\n};\n\n//Структура элемента набора данных\nconst P8P_CHART_DATASET_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n label: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n borderColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n data: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)).isRequired,\n items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)).isRequired\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//График\nconst P8PChart = ({\n type,\n title,\n legendPosition,\n options,\n labels,\n datasets,\n onClick,\n style\n}) => {\n //Ссылки на DOM\n const chartCanvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chartRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент графика\n const handleClick = e => {\n const bar = chartRef.current.getElementsAtEventForMode(e, \"nearest\", {\n intersect: true\n }, true)[0];\n if (onClick && bar) onClick({\n datasetIndex: bar.datasetIndex,\n itemIndex: bar.index,\n item: chartRef.current.data.datasets[bar.datasetIndex].items ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] : null\n });\n };\n\n //При подключении к старнице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!chartRef.current) {\n const ctx = chartCanvasRef.current.getContext(\"2d\");\n chartRef.current = new chart_js_auto__WEBPACK_IMPORTED_MODULE_1__[\"default\"](ctx, {\n type,\n data: {\n labels: [...labels],\n datasets: [...datasets]\n },\n options: {\n ...options,\n ...{\n responsive: true,\n plugins: {\n legend: {\n display: legendPosition ? true : false,\n position: legendPosition\n },\n title: {\n display: title ? true : false,\n text: title\n }\n }\n },\n onClick: handleClick\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (chartRef.current) {\n chartRef.current.data.labels = [...labels];\n chartRef.current.data.datasets = [...datasets];\n chartRef.current.update();\n }\n }, [datasets, labels]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...style\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"canvas\", {\n ref: chartCanvasRef\n }));\n};\n\n//Контроль свойств - График\nP8PChart.propTypes = {\n type: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n legendPosition: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n options: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n labels: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)).isRequired,\n datasets: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_CHART_DATASET_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n style: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_chart.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PChart: () => (/* binding */ P8PChart),\n/* harmony export */ P8P_CHART_TYPE: () => (/* binding */ P8P_CHART_TYPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js/auto */ \"./node_modules/chart.js/auto/auto.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: График\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Диаграммы и графики\n\n//---------\n//Константы\n//---------\n\n//Виды графиков\nconst P8P_CHART_TYPE = {\n BAR: \"bar\",\n LINE: \"line\",\n PIE: \"pie\",\n DOUGHNUT: \"doughnut\"\n};\n\n//Структура элемента набора данных\nconst P8P_CHART_DATASET_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n label: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n borderColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n data: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)).isRequired,\n items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)).isRequired\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//График\nconst P8PChart = ({\n type,\n title,\n legendPosition,\n options,\n labels,\n datasets,\n onClick,\n style\n}) => {\n //Ссылки на DOM\n const chartCanvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chartRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент графика\n const handleClick = e => {\n const bar = chartRef.current.getElementsAtEventForMode(e, \"nearest\", {\n intersect: true\n }, true)[0];\n if (onClick && bar) onClick({\n datasetIndex: bar.datasetIndex,\n itemIndex: bar.index,\n item: chartRef.current.data.datasets[bar.datasetIndex].items ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] : null\n });\n };\n\n //При подключении к старнице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!chartRef.current) {\n const ctx = chartCanvasRef.current.getContext(\"2d\");\n chartRef.current = new chart_js_auto__WEBPACK_IMPORTED_MODULE_1__[\"default\"](ctx, {\n type,\n data: {\n labels: [...labels],\n datasets: [...datasets]\n },\n options: {\n ...options,\n ...{\n responsive: true,\n plugins: {\n legend: {\n display: legendPosition ? true : false,\n position: legendPosition\n },\n title: {\n display: title ? true : false,\n text: title\n }\n }\n },\n onClick: handleClick\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (chartRef.current) {\n chartRef.current.data.labels = [...labels];\n chartRef.current.data.datasets = [...datasets];\n chartRef.current.update();\n }\n }, [datasets, labels]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...style\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"canvas\", {\n ref: chartCanvasRef\n }));\n};\n\n//Контроль свойств - График\nP8PChart.propTypes = {\n type: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n legendPosition: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n options: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n labels: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)).isRequired,\n datasets: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_CHART_DATASET_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n style: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_chart.js?"); /***/ }), @@ -3106,7 +3227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PDataGrid: () => (/* binding */ P8PDataGrid),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* binding */ P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* binding */ P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* binding */ P8P_DATA_GRID_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _p8p_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_table */ \"./app/components/p8p_table.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица данных\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Таблица\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_DATA_GRID_SIZE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_SIZE;\n\n//Типы данных\nconst P8P_DATA_GRID_DATA_TYPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_DATA_TYPE;\n\n//Формат фильтра\nconst P8P_DATA_GRID_FILTER_SHAPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTER_SHAPE;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица данных\nconst P8PDataGrid = ({\n columnsDef,\n filtersInitial,\n groups,\n rows,\n size,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - сортировки\n const [orders, setOrders] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Собственное состояние - фильтры\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filtersInitial || []);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n columnName,\n direction\n }) => {\n let newOrders = objectsCopier(orders);\n const curOrder = newOrders.find(o => o.name == columnName);\n if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);\n if (direction != null && !curOrder) newOrders.push({\n name: columnName,\n direction\n });\n if (direction != null && curOrder) curOrder.direction = direction;\n setOrders(newOrders);\n if (onOrderChanged) onOrderChanged({\n orders: newOrders\n });\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n columnName,\n from,\n to\n }) => {\n let newFilters = objectsCopier(filters);\n let curFilter = newFilters.find(f => f.name == columnName);\n if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);\n if ((from != null || to != null) && !curFilter) newFilters.push({\n name: columnName,\n from,\n to\n });\n if ((from != null || to != null) && curFilter) {\n curFilter.from = from;\n curFilter.to = to;\n }\n setFilters(newFilters);\n if (onFilterChanged) onFilterChanged({\n filters: newFilters\n });\n };\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //При изменении списка установленных извне фильтров\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setFilters(filtersInitial || []);\n }, [filtersInitial]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8PTable, {\n columnsDef: columnsDef,\n groups: groups,\n rows: rows,\n orders: orders,\n filters: filters,\n size: size || P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: morePages,\n reloading: reloading,\n expandable: expandable,\n orderAscMenuItemCaption: orderAscMenuItemCaption,\n orderDescMenuItemCaption: orderDescMenuItemCaption,\n filterMenuItemCaption: filterMenuItemCaption,\n valueFilterCaption: valueFilterCaption,\n valueFromFilterCaption: valueFromFilterCaption,\n valueToFilterCaption: valueToFilterCaption,\n okFilterBtnCaption: okFilterBtnCaption,\n clearFilterBtnCaption: clearFilterBtnCaption,\n cancelFilterBtnCaption: cancelFilterBtnCaption,\n morePagesBtnCaption: morePagesBtnCaption,\n noDataFoundText: noDataFoundText,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n rowExpandRender: rowExpandRender,\n valueFormatter: valueFormatter,\n objectsCopier: objectsCopier,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n });\n};\n\n//Контроль свойств - Таблица данных\nP8PDataGrid.propTypes = {\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filtersInitial: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_DATA_GRID_FILTER_SHAPE),\n groups: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PDataGrid: () => (/* binding */ P8PDataGrid),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* binding */ P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* binding */ P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* binding */ P8P_DATA_GRID_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _p8p_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_table */ \"./app/components/p8p_table.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Таблица данных\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Таблица\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_DATA_GRID_SIZE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_SIZE;\n\n//Типы данных\nconst P8P_DATA_GRID_DATA_TYPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_DATA_TYPE;\n\n//Формат фильтра\nconst P8P_DATA_GRID_FILTER_SHAPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTER_SHAPE;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица данных\nconst P8PDataGrid = ({\n columnsDef,\n filtersInitial,\n rows,\n size,\n morePages,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - сортировки\n const [orders, setOrders] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Собственное состояние - фильтры\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filtersInitial || []);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n columnName,\n direction\n }) => {\n let newOrders = objectsCopier(orders);\n const curOrder = newOrders.find(o => o.name == columnName);\n if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);\n if (direction != null && !curOrder) newOrders.push({\n name: columnName,\n direction\n });\n if (direction != null && curOrder) curOrder.direction = direction;\n setOrders(newOrders);\n if (onOrderChanged) onOrderChanged({\n orders: newOrders\n });\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n columnName,\n from,\n to\n }) => {\n let newFilters = objectsCopier(filters);\n let curFilter = newFilters.find(f => f.name == columnName);\n if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);\n if ((from != null || to != null) && !curFilter) newFilters.push({\n name: columnName,\n from,\n to\n });\n if ((from != null || to != null) && curFilter) {\n curFilter.from = from;\n curFilter.to = to;\n }\n setFilters(newFilters);\n if (onFilterChanged) onFilterChanged({\n filters: newFilters\n });\n };\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //При изменении списка установленных извне фильтров\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setFilters(filtersInitial || []);\n }, [filtersInitial]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8PTable, {\n columnsDef: columnsDef,\n rows: rows,\n orders: orders,\n filters: filters,\n size: size || P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: morePages,\n reloading: reloading,\n expandable: expandable,\n orderAscMenuItemCaption: orderAscMenuItemCaption,\n orderDescMenuItemCaption: orderDescMenuItemCaption,\n filterMenuItemCaption: filterMenuItemCaption,\n valueFilterCaption: valueFilterCaption,\n valueFromFilterCaption: valueFromFilterCaption,\n valueToFilterCaption: valueToFilterCaption,\n okFilterBtnCaption: okFilterBtnCaption,\n clearFilterBtnCaption: clearFilterBtnCaption,\n cancelFilterBtnCaption: cancelFilterBtnCaption,\n morePagesBtnCaption: morePagesBtnCaption,\n noDataFoundText: noDataFoundText,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n rowExpandRender: rowExpandRender,\n valueFormatter: valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n });\n};\n\n//Контроль свойств - Таблица данных\nP8PDataGrid.propTypes = {\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filtersInitial: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_DATA_GRID_FILTER_SHAPE),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_data_grid.js?"); /***/ }), @@ -3117,7 +3238,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PFullScreenDialog: () => (/* binding */ P8PFullScreenDialog)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Полноэкранный диалог\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DIALOG_TITLE: {\n padding: 0\n },\n APP_BAR: {\n position: \"relative\"\n },\n TITLE_TYPOGRAPHY: {\n ml: 2,\n flex: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Полноэкранный диалог\nconst P8PFullScreenDialog = ({\n title,\n onClose,\n children\n}) => {\n const handleClose = () => {\n onClose ? onClose() : null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n fullScreen: true,\n open: true,\n onClose: handleClose,\n scroll: \"paper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.DIALOG_TITLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n edge: \"start\",\n color: \"inherit\",\n onClick: handleClose,\n \"aria-label\": \"close\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE_TYPOGRAPHY,\n variant: \"h6\",\n component: \"div\"\n }, title)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, children));\n};\n\n//Контроль свойств - Полноэкранный диалог\nP8PFullScreenDialog.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_fullscreen_dialog.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PFullScreenDialog: () => (/* binding */ P8PFullScreenDialog)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Полноэкранный диалог\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DIALOG_TITLE: {\n padding: 0\n },\n APP_BAR: {\n position: \"relative\"\n },\n TITLE_TYPOGRAPHY: {\n ml: 2,\n flex: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Полноэкранный диалог\nconst P8PFullScreenDialog = ({\n title,\n onClose,\n children\n}) => {\n const handleClose = () => {\n onClose ? onClose() : null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n fullScreen: true,\n open: true,\n onClose: handleClose,\n scroll: \"paper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.DIALOG_TITLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n edge: \"start\",\n color: \"inherit\",\n onClick: handleClose,\n \"aria-label\": \"close\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE_TYPOGRAPHY,\n variant: \"h6\",\n component: \"div\"\n }, title)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, children));\n};\n\n//Контроль свойств - Полноэкранный диалог\nP8PFullScreenDialog.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_fullscreen_dialog.js?"); /***/ }), @@ -3128,7 +3249,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PGantt: () => (/* binding */ P8PGantt),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* binding */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* binding */ P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* binding */ P8P_GANTT_TASK_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Slider/Slider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Диаграмма Ганта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_GANTT_ZOOM = [0, 1, 2, 3, 4];\n\n//Уровни масштаба (строковые наименования в терминах библиотеки)\nconst P8P_GANTT_ZOOM_VIEW_MODES = {\n 0: \"Quarter Day\",\n 1: \"Half Day\",\n 2: \"Day\",\n 3: \"Week\",\n 4: \"Month\"\n};\n\n//Структура задачи\nconst P8P_GANTT_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number).isRequired,\n numb: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n dependencies: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_GANTT_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Структура описания цвета задачи\nconst P8P_GANTT_TASK_COLOR_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n numbCaption,\n nameCaption,\n startCaption,\n endCaption,\n progressCaption,\n legendCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end,\n progress: task.progress\n });\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk({\n task,\n start: state.start,\n end: state.end,\n progress: state.progress\n }) : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //При изменении сроков\n const handlePeriodChanged = e => setState(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //При изменении прогресса\n const handleProgressChanged = (e, newValue) => setState(prev => ({\n ...prev,\n progress: newValue\n }));\n\n //Описание легенды для задачи\n let legend = null;\n if (Array.isArray(taskColors)) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor);\n if (colorDesc) legend = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: {\n ...(colorDesc.bgColor ? {\n backgroundColor: colorDesc.bgColor\n } : {}),\n ...(colorDesc.textColor ? {\n color: colorDesc.textColor\n } : {})\n }\n },\n primary: legendCaption,\n secondary: colorDesc.desc\n });\n }\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: numbCaption,\n secondary: task.numb\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: startCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.start,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.start,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: endCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.end,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.end,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), hasValue(task.progress) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: `${progressCaption}${task.readOnly === true || task.readOnlyProgress === true ? ` (${task.progress}%)` : \"\"}`,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n disabled: task.readOnly === true || task.readOnlyProgress === true,\n defaultValue: task.progress,\n valueLabelDisplay: \"auto\",\n onChange: handleProgressChanged\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, legend ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, legend), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => hasValue(task[attr.name])).map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < taskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n disabled: !state.start || !state.end || task.readOnly,\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Редактор задачи\nP8PGanttTaskEditor.propTypes = {\n task: P8P_GANTT_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n numbCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Диаграмма Ганта\nconst P8PGantt = ({\n height,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n zoom,\n tasks,\n taskAttributes,\n taskColors,\n onTaskDatesChange,\n onTaskProgressChange,\n taskAttributeRenderer,\n noDataFoundText,\n numbTaskEditorCaption,\n nameTaskEditorCaption,\n startTaskEditorCaption,\n endTaskEditorCaption,\n progressTaskEditorCaption,\n legendTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n gantt: null,\n zoom: P8P_GANTT_ZOOM.includes(zoom) ? zoom : 3,\n editTask: null\n });\n\n //Отображение диаграммы\n const showGantt = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (!state.gantt) {\n // eslint-disable-next-line no-undef\n const gantt = new Gantt(\"#__gantt__\", tasks, {\n view_mode: P8P_GANTT_ZOOM_VIEW_MODES[state.zoom],\n date_format: \"YYYY-MM-DD\",\n language: \"ru\",\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n on_date_change: (task, start, end, isMain) => onTaskDatesChange ? onTaskDatesChange({\n task,\n start,\n end,\n isMain\n }) : null,\n on_progress_change: (task, progress) => onTaskProgressChange ? onTaskProgressChange({\n task,\n progress\n }) : null,\n on_click: openTaskEditor\n });\n setState(pv => ({\n ...pv,\n gantt,\n noData: false\n }));\n } else {\n state.gantt.refresh(tasks);\n setState(pv => ({\n ...pv,\n noData: false\n }));\n }\n }, [state.gantt, state.zoom, readOnly, readOnlyDates, readOnlyProgress, tasks, onTaskDatesChange, onTaskProgressChange]);\n\n //Обновление масштаба диаграммы\n const handleZoomChange = direction => setState(pv => ({\n ...pv,\n zoom: pv.zoom + direction < 0 ? 0 : pv.zoom + direction >= P8P_GANTT_ZOOM.length ? P8P_GANTT_ZOOM.length - 1 : pv.zoom + direction\n }));\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = ({\n task,\n start,\n end,\n progress\n }) => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n if (onTaskDatesChange && (task.start != start || task.end != end)) onTaskDatesChange({\n task,\n start,\n end,\n isMain: true\n });\n if (onTaskProgressChange && task.progress != progress) onTaskProgressChange({\n task,\n progress\n });\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При изменении масштаба\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.gantt) state.gantt.change_view_mode(P8P_GANTT_ZOOM_VIEW_MODES[state.zoom]);\n }, [state.gantt, state.zoom]);\n\n //При изменении списка задач\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (Array.isArray(tasks) && tasks.length > 0) showGantt();else setState(pv => ({\n ...pv,\n noData: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tasks]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, state.gantt && state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.gantt && !state.noData && title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 1,\n sx: {\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, state.gantt && !state.noData && zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_GANTT_ZOOM.length - 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_out\"))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PGanttTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n taskColors: taskColors,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n numbCaption: numbTaskEditorCaption,\n nameCaption: nameTaskEditorCaption,\n startCaption: startTaskEditorCaption,\n endCaption: endTaskEditorCaption,\n progressCaption: progressTaskEditorCaption,\n legendCaption: legendTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n height,\n display: state.noData ? \"none\" : \"\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n height: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_SHAPE).isRequired,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onTaskDatesChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onTaskProgressChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n numbTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_gantt.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PGantt: () => (/* binding */ P8PGantt),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* binding */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* binding */ P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* binding */ P8P_GANTT_TASK_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Slider/Slider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Диаграмма Ганта\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_GANTT_ZOOM = [0, 1, 2, 3, 4];\n\n//Уровни масштаба (строковые наименования в терминах библиотеки)\nconst P8P_GANTT_ZOOM_VIEW_MODES = {\n 0: \"Quarter Day\",\n 1: \"Half Day\",\n 2: \"Day\",\n 3: \"Week\",\n 4: \"Month\"\n};\n\n//Структура задачи\nconst P8P_GANTT_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number).isRequired,\n numb: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n dependencies: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_GANTT_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Структура описания цвета задачи\nconst P8P_GANTT_TASK_COLOR_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n numbCaption,\n nameCaption,\n startCaption,\n endCaption,\n progressCaption,\n legendCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end,\n progress: task.progress\n });\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk({\n task,\n start: state.start,\n end: state.end,\n progress: state.progress\n }) : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //При изменении сроков\n const handlePeriodChanged = e => setState(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //При изменении прогресса\n const handleProgressChanged = (e, newValue) => setState(prev => ({\n ...prev,\n progress: newValue\n }));\n\n //Описание легенды для задачи\n let legend = null;\n if (Array.isArray(taskColors)) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) legend = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: {\n ...(colorDesc.bgProgressColor ? {\n background: `linear-gradient(to right, ${colorDesc.bgProgressColor} ,${colorDesc.bgColor ? colorDesc.bgColor : \"transparent\"})}`\n } : colorDesc.bgColor ? {\n backgroundColor: colorDesc.bgColor\n } : {}),\n ...(colorDesc.textColor ? {\n color: colorDesc.textColor\n } : {})\n }\n },\n primary: legendCaption,\n secondary: colorDesc.desc\n });\n }\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: numbCaption,\n secondary: task.numb\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: startCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.start,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.start,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: endCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.end,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.end,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), hasValue(task.progress) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: `${progressCaption}${task.readOnly === true || task.readOnlyProgress === true ? ` (${task.progress}%)` : \"\"}`,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n disabled: task.readOnly === true || task.readOnlyProgress === true,\n defaultValue: task.progress,\n valueLabelDisplay: \"auto\",\n onChange: handleProgressChanged\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, legend ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, legend), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => hasValue(task[attr.name])).map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < taskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n disabled: !state.start || !state.end || task.readOnly,\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Редактор задачи\nP8PGanttTaskEditor.propTypes = {\n task: P8P_GANTT_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n numbCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Диаграмма Ганта\nconst P8PGantt = ({\n height,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n zoom,\n tasks,\n taskAttributes,\n taskColors,\n onTaskDatesChange,\n onTaskProgressChange,\n taskAttributeRenderer,\n noDataFoundText,\n numbTaskEditorCaption,\n nameTaskEditorCaption,\n startTaskEditorCaption,\n endTaskEditorCaption,\n progressTaskEditorCaption,\n legendTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n gantt: null,\n zoom: P8P_GANTT_ZOOM.includes(zoom) ? zoom : 3,\n editTask: null\n });\n\n //Отображение диаграммы\n const showGantt = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (!state.gantt) {\n // eslint-disable-next-line no-undef\n const gantt = new Gantt(\"#__gantt__\", tasks, {\n view_mode: P8P_GANTT_ZOOM_VIEW_MODES[state.zoom],\n date_format: \"YYYY-MM-DD\",\n language: \"ru\",\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n on_date_change: (task, start, end, isMain) => onTaskDatesChange ? onTaskDatesChange({\n task,\n start,\n end,\n isMain\n }) : null,\n on_progress_change: (task, progress) => onTaskProgressChange ? onTaskProgressChange({\n task,\n progress\n }) : null,\n on_click: openTaskEditor\n });\n setState(pv => ({\n ...pv,\n gantt,\n noData: false\n }));\n } else {\n state.gantt.refresh(tasks);\n setState(pv => ({\n ...pv,\n noData: false\n }));\n }\n }, [state.gantt, state.zoom, readOnly, readOnlyDates, readOnlyProgress, tasks, onTaskDatesChange, onTaskProgressChange]);\n\n //Обновление масштаба диаграммы\n const handleZoomChange = direction => setState(pv => ({\n ...pv,\n zoom: pv.zoom + direction < 0 ? 0 : pv.zoom + direction >= P8P_GANTT_ZOOM.length ? P8P_GANTT_ZOOM.length - 1 : pv.zoom + direction\n }));\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = ({\n task,\n start,\n end,\n progress\n }) => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n if (onTaskDatesChange && (task.start != start || task.end != end)) onTaskDatesChange({\n task,\n start,\n end,\n isMain: true\n });\n if (onTaskProgressChange && task.progress != progress) onTaskProgressChange({\n task,\n progress\n });\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При изменении масштаба\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.gantt) state.gantt.change_view_mode(P8P_GANTT_ZOOM_VIEW_MODES[state.zoom]);\n }, [state.gantt, state.zoom]);\n\n //При изменении списка задач\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (Array.isArray(tasks) && tasks.length > 0) showGantt();else setState(pv => ({\n ...pv,\n noData: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tasks]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, state.gantt && state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.gantt && !state.noData && title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 1,\n sx: {\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, state.gantt && !state.noData && zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_GANTT_ZOOM.length - 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_out\"))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PGanttTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n taskColors: taskColors,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n numbCaption: numbTaskEditorCaption,\n nameCaption: nameTaskEditorCaption,\n startCaption: startTaskEditorCaption,\n endCaption: endTaskEditorCaption,\n progressCaption: progressTaskEditorCaption,\n legendCaption: legendTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n height,\n display: state.noData ? \"none\" : \"\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n height: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_SHAPE).isRequired,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onTaskDatesChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onTaskProgressChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n numbTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_gantt.js?"); /***/ }), @@ -3139,7 +3260,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Меню панелей\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"center\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n }\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"64px\",\n height: \"64px\",\n fontSize: \"64px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), panel.caption)));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Меню панелей\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"center\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n }\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"64px\",\n height: \"64px\",\n fontSize: \"64px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), panel.caption)));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); /***/ }), @@ -3150,18 +3271,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8p_table_reducer */ \"./app/components/p8p_table_reducer.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\",\n EXPAND_TOGGLE: \"EXPAND_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any)\n});\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Панель инструментов столбца (левая)\nconst P8PTableColumnToolBarLeft = ({\n columnDef,\n onItemClick\n}) => {\n //Кнопка развёртывания/свёртывания\n let expButton = null;\n if (columnDef.expandable) expButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, columnDef.expanded ? \"indeterminate_check_box\" : \"add_box\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, expButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (левая)\nP8PTableColumnToolBarLeft.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Панель инструментов столбца (правая)\nconst P8PTableColumnToolBarRight = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if ((0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.from) || (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"filter_alt\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (правая)\nP8PTableColumnToolBarRight.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n pb: 2\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n groups = [{}],\n rows,\n orders,\n filters,\n size,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - описание заголовка\n const [header, dispatchHeaderAction] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.p8pTableReducer, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.HEADER_INITIAL_STATE)());\n\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояния - развёрнутые группы\n const [expandedGroups, setExpandedGroups] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Формирование заголовка таблицы\n const setHeader = ({\n columnsDef,\n expandable,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.SET_HEADER,\n payload: {\n columnsDef,\n expandable,\n objectsCopier\n }\n });\n\n //Сворачивание/разворачивание уровня заголовка таблицы\n const toggleHeaderExpand = ({\n columnName,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.TOGGLE_HEADER_EXPAND,\n payload: {\n columnName,\n expandable,\n objectsCopier\n }\n });\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE:\n toggleHeaderExpand({\n columnName,\n objectsCopier\n });\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //При изменении описания колонок\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setHeader({\n columnsDef,\n expandable,\n objectsCopier\n });\n }, [columnsDef, expandable, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n colSpan: header.displayDataColumnsCount,\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle\n }\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.TABLE_COLUMN_STACK\n }, group.expandable ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => {\n setExpandedGroups(pv => ({\n ...pv,\n ...{\n [group.name]: !pv[group.name]\n }\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expandedGroups[group.name] ? \"indeterminate_check_box\" : \"add_box\")) : null, customRender.data ? customRender.data : group.caption));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n component: _mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], null, header.displayLevels.map(level => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: level\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\"\n }) : null, header.displayLevelsColumns[level].map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n },\n rowSpan: columnDef.rowSpan,\n colSpan: columnDef.colSpan\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarLeft, {\n columnDef: columnDef,\n onItemClick: handleToolBarItemClick\n }), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarRight, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, rows.length > 0 ? groups.map((group, g) => {\n const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, header.displayDataColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: STYLES.TABLE_CELL_EXPAND_CONTAINER,\n colSpan: header.displayDataColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null) : null);\n return !group?.name ? rowsView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `group-${g}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : null)), rows.length == 0 ? noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null : morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnCaption)) : null));\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n parent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })).isRequired,\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); - -/***/ }), - -/***/ "./app/components/p8p_table_reducer.js": -/*!*********************************************!*\ - !*** ./app/components/p8p_table_reducer.js ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HEADER_INITIAL_STATE: () => (/* binding */ HEADER_INITIAL_STATE),\n/* harmony export */ P8P_TABLE_AT: () => (/* binding */ P8P_TABLE_AT),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ p8pTableReducer: () => (/* binding */ p8pTableReducer)\n/* harmony export */ });\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица - редьюсер состояния\r\n*/\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst P8P_TABLE_AT = {\n SET_HEADER: \"SET_HEADER\",\n //Установка заголовка таблицы\n TOGGLE_HEADER_EXPAND: \"TOGGLE_HEADER_EXPAND\" //Сворачивание/разворачивание уровня заголовка\n};\n\n//Состояние заголовка таблицы по умолчанию\nconst HEADER_INITIAL_STATE = () => ({\n columnsDef: [],\n displayLevels: [],\n displayLevelsColumns: {},\n displayDataColumnsCount: 0,\n displayDataColumns: []\n});\n\n//Состояние описания ячейки заголовка таблицы по умолчанию\nconst HEADER_COLUMN_INITIAL_STATE = ({\n columnDef,\n objectsCopier\n}) => {\n const tmp = objectsCopier(columnDef);\n if (!hasValue(tmp.parent)) tmp.parent = \"\";\n if (!hasValue(tmp.expandable)) tmp.expandable = false;\n if (!hasValue(tmp.expanded)) tmp.expanded = true;\n return tmp;\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== undefined && value !== null && value !== \"\";\n\n//Определение высоты (в уровнях) ячейки заголовка\nconst getDisplayColumnRowSpan = (displayTree, maxLevel) => {\n displayTree.forEach(columnDef => {\n columnDef.rowSpan = columnDef.hasChild ? maxLevel - columnDef.childMaxLevel + 1 : maxLevel - columnDef.level + 1;\n if (columnDef.hasChild) getDisplayColumnRowSpan(columnDef.child, maxLevel);\n });\n};\n\n//Определение ширины (в колонках) ячейки заголовка\nconst getDisplayColumnColSpan = (displayTree, columnDef) => {\n if (columnDef.hasChild) {\n let colSpan = 0;\n displayTree.forEach(cD => cD.parent == columnDef.name ? colSpan += getDisplayColumnColSpan(cD.child, cD) : null);\n return colSpan;\n } else return 1;\n};\n\n//Формирование дерева отображаемых элементов заголовка\nconst buildDisplayTree = (columnsDef, parent, level) => {\n const baseBuild = (columnsDef, parent, level) => {\n let maxLevel = level - 1;\n const res = columnsDef.filter(columnDef => columnDef.parent == parent && columnDef.visible).map(columnDef => {\n const [child, childMaxLevel] = columnDef.expanded ? baseBuild(columnsDef, columnDef.name, level + 1) : [[], level];\n if (childMaxLevel > maxLevel) maxLevel = childMaxLevel;\n const res = {\n ...columnDef,\n child,\n hasChild: child.length > 0 ? true : false,\n level,\n childMaxLevel: child.length > 0 ? childMaxLevel : 0\n };\n return {\n ...res,\n colSpan: getDisplayColumnColSpan(child, res),\n rowSpan: 1\n };\n });\n return [res, maxLevel];\n };\n const [displayTree, maxLevel] = baseBuild(columnsDef, parent, level);\n getDisplayColumnRowSpan(displayTree, maxLevel);\n return [displayTree, maxLevel];\n};\n\n//Формирование коллекции отображаемых колонок уровня\nconst buildDisplayLevelsColumns = (displayTree, maxLevel) => {\n const extractLevel = (displayTree, level) => {\n let res = [];\n displayTree.forEach(columnDef => {\n if (columnDef.level == level) res.push(columnDef);\n if (columnDef.hasChild) res = res.concat(extractLevel(columnDef.child, level));\n });\n return res;\n };\n const displayLevels = [...Array(maxLevel).keys()].map(i => i + 1);\n const displayLevelsColumns = {};\n displayLevels.forEach(level => displayLevelsColumns[level] = extractLevel(displayTree, level));\n return [displayLevels, displayLevelsColumns];\n};\n\n//Формирование коллекции отображаемых колонок данных\nconst buildDisplayDataColumns = (displayTree, expandable) => {\n const displayDataColumns = [];\n const traverseTree = displayTree => {\n displayTree.forEach(columnDef => !columnDef.hasChild ? displayDataColumns.push(columnDef) : traverseTree(columnDef.child));\n };\n traverseTree(displayTree);\n return [displayDataColumns, displayDataColumns.length + (expandable === true ? 1 : 0)];\n};\n\n//Формирование описания отображаемых колонок\nconst buildDisplay = ({\n columnsDef,\n expandable\n}) => {\n //Сформируем дерево отображаемых колонок заголовка\n const [displayTree, maxLevel] = buildDisplayTree(columnsDef, \"\", 1);\n //Вытянем дерево в удобные для рендеринга структуры\n const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //Сформируем отображаемые колонки данных\n const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n //Вернём результат\n return [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount];\n};\n\n//Формирование описания заголовка\nconst buildHeaderDef = ({\n columnsDef,\n expandable,\n objectsCopier\n}) => {\n //Инициализируем результат\n const res = HEADER_INITIAL_STATE();\n //Инициализируем внутренне описание колонок и поместим его в результат\n columnsDef.forEach(columnDef => res.columnsDef.push(HEADER_COLUMN_INITIAL_STATE({\n columnDef,\n objectsCopier\n })));\n //Добавим в результат сведения об отображаемых данных\n [res.displayLevels, res.displayLevelsColumns, res.displayDataColumns, res.displayDataColumnsCount] = buildDisplay({\n columnsDef: res.columnsDef,\n expandable\n });\n //Сформируем дерево отображаемых колонок заголовка\n //const [displayTree, maxLevel] = buildDisplayTree(res.columnsDef, \"\", 1);\n //Вытянем дерево в удобные для рендеринга структуры\n //[res.displayLevels, res.displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //Сформируем отображаемые колонки данных\n //[res.displayDataColumns, res.displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n //Вернём результат\n return res;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Формирование заголовка\n [P8P_TABLE_AT.SET_HEADER]: (state, {\n payload\n }) => {\n const {\n columnsDef,\n expandable,\n objectsCopier\n } = payload;\n return {\n ...state,\n ...buildHeaderDef({\n columnsDef,\n expandable,\n objectsCopier\n })\n };\n },\n [P8P_TABLE_AT.TOGGLE_HEADER_EXPAND]: (state, {\n payload\n }) => {\n const {\n columnName,\n expandable,\n objectsCopier\n } = payload;\n const columnsDef = objectsCopier(state.columnsDef);\n columnsDef.forEach(columnDef => columnDef.name == columnName ? columnDef.expanded = !columnDef.expanded : null);\n const [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount] = buildDisplay({\n columnsDef,\n expandable\n });\n //const [displayTree, maxLevel] = buildDisplayTree(columnsDef, \"\", 1);\n //const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n return {\n ...state,\n columnsDef,\n displayLevels,\n displayLevelsColumns,\n displayDataColumns,\n displayDataColumnsCount\n };\n },\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst p8pTableReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table_reducer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Компонент: Таблица\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any)\n});\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Панель инструментов столбца\nconst P8PTableColumnToolBar = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if (hasValue(filter?.from) || hasValue(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"filter_alt\"));\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца\nP8PTableColumnToolBar.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n pb: 2\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", hasValue(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, hasValue(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, hasValue(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, hasValue(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n rows,\n orders,\n filters,\n size,\n morePages,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged\n}) => {\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Определение списка видимых колонок\n const visibleColumns = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => columnsDef.filter(columnDef => columnDef.visible === true), [columnsDef]);\n\n //Определение количества видимых колонок\n const visibleColumnsCount = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => visibleColumns.length + (expandable === true ? 1 : 0), [visibleColumns, expandable]);\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = dataType => dataType === P8P_TABLE_DATA_TYPE.DATE ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = dataType => dataType === P8P_TABLE_DATA_TYPE.DATE ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n component: _mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\"\n }) : null, visibleColumns.map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef.dataType),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef.dataType),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBar, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, rows.length > 0 ? rows.map((row, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, visibleColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef.dataType),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n sx: STYLES.TABLE_CELL_EXPAND_CONTAINER,\n colSpan: visibleColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null)) : null)), rows.length == 0 ? noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null : morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnCaption)) : null));\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array)\n })).isRequired,\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); /***/ }), @@ -3172,7 +3282,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigWrapper: () => (/* binding */ ConfigWrapper),\n/* harmony export */ P8PAppWorkspaceConfigWrapped: () => (/* binding */ P8PAppWorkspaceConfigWrapped),\n/* harmony export */ P8PDataGridConfigWrapped: () => (/* binding */ P8PDataGridConfigWrapped),\n/* harmony export */ P8PGanttConfigWrapped: () => (/* binding */ P8PGanttConfigWrapped),\n/* harmony export */ P8PPanelsMenuGridConfigWrapped: () => (/* binding */ P8PPanelsMenuGridConfigWrapped),\n/* harmony export */ P8PTableConfigWrapped: () => (/* binding */ P8PTableConfigWrapped),\n/* harmony export */ P8P_APP_WORKSPACE_CONFIG_PROPS: () => (/* binding */ P8P_APP_WORKSPACE_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_CONFIG_PROPS: () => (/* binding */ P8P_DATA_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE),\n/* harmony export */ P8P_GANTT_CONFIG_PROPS: () => (/* binding */ P8P_GANTT_CONFIG_PROPS),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_SHAPE),\n/* harmony export */ P8P_PANELS_MENU_GRID_CONFIG_PROPS: () => (/* binding */ P8P_PANELS_MENU_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* reexport safe */ _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8P_PANELS_MENU_PANEL_SHAPE),\n/* harmony export */ P8P_TABLE_CONFIG_PROPS: () => (/* binding */ P8P_TABLE_CONFIG_PROPS),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_table */ \"./app/components/p8p_table.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Обёртки для компонент, обеспечивающие подключение их к настройкам приложения\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Вспомогательные процедуры и функции\n //Текстовые ресурсы и константы\n //Меню панелей\n //Рабочее пространство\n //Таблица данных\n //Таблица данных\n //Диаграмма Ганта\n\n//---------\n//Константы\n//---------\n\n//Конфигурируемые свойства \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8P_PANELS_MENU_GRID_CONFIG_PROPS = {\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE,\n defaultGroupTytle: _app_text__WEBPACK_IMPORTED_MODULE_2__.TITLES.DEFAULT_PANELS_GROUP\n};\n\n//Конфигурируемые свойства \"Рабочего пространства\" (P8PAppWorkspace)\nconst P8P_APP_WORKSPACE_CONFIG_PROPS = {\n closeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLOSE,\n homeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE_HOME\n};\n\n//Конфигурируемые свойства \"Таблицы\" (P8PTable)\nconst P8P_TABLE_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND\n};\n\n//Конфигурируемые свойства \"Таблицы данных\" (P8PDataGrid)\nconst P8P_DATA_GRID_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n objectsCopier: _core_utils__WEBPACK_IMPORTED_MODULE_1__.deepCopyObject\n};\n\n//Конфигурируемые свойства \"Диаграммы Ганта\" (P8PGantt)\nconst P8P_GANTT_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n numbTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NUMB,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n startTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.START,\n endTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.END,\n progressTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.PROGRESS,\n legendTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.LEGEND,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//-----------------------\n//Вспомогательные функции\n//-----------------------\n\n//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов\nconst addConfigChildProps = children => react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(child)) return child;\n const {\n children,\n ...restProps\n } = child.props;\n let configProps = {};\n if (child.type.name === \"P8PPanelsMenuGrid\") configProps = P8P_PANELS_MENU_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PTable\") configProps = P8P_TABLE_CONFIG_PROPS;\n if (child.type.name === \"P8PDataGrid\") configProps = P8P_DATA_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PGantt\") configProps = P8P_GANTT_CONFIG_PROPS;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(child.type, {\n ...configProps,\n ...restProps\n }, addConfigChildProps(children));\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для компонента \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8PPanelsMenuGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8PPanelsMenuGrid, _extends({}, P8P_PANELS_MENU_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Рабочее пространство\" (P8PAppWorkspace)\nconst P8PAppWorkspaceConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, P8P_APP_WORKSPACE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица\" (P8PTable)\nconst P8PTableConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8PTable, _extends({}, P8P_TABLE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица данных\" (P8PDataGrid)\nconst P8PDataGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, P8P_DATA_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Диаграмма Ганта\" (P8PGantt)\nconst P8PGanttConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Универсальный элемент-обёртка в параметры конфигурации\nconst ConfigWrapper = ({\n children\n}) => addConfigChildProps(children);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/config_wrapper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigWrapper: () => (/* binding */ ConfigWrapper),\n/* harmony export */ P8PAppWorkspaceConfigWrapped: () => (/* binding */ P8PAppWorkspaceConfigWrapped),\n/* harmony export */ P8PDataGridConfigWrapped: () => (/* binding */ P8PDataGridConfigWrapped),\n/* harmony export */ P8PGanttConfigWrapped: () => (/* binding */ P8PGanttConfigWrapped),\n/* harmony export */ P8PPanelsMenuGridConfigWrapped: () => (/* binding */ P8PPanelsMenuGridConfigWrapped),\n/* harmony export */ P8PTableConfigWrapped: () => (/* binding */ P8PTableConfigWrapped),\n/* harmony export */ P8P_APP_WORKSPACE_CONFIG_PROPS: () => (/* binding */ P8P_APP_WORKSPACE_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_CONFIG_PROPS: () => (/* binding */ P8P_DATA_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE),\n/* harmony export */ P8P_GANTT_CONFIG_PROPS: () => (/* binding */ P8P_GANTT_CONFIG_PROPS),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_SHAPE),\n/* harmony export */ P8P_PANELS_MENU_GRID_CONFIG_PROPS: () => (/* binding */ P8P_PANELS_MENU_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* reexport safe */ _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8P_PANELS_MENU_PANEL_SHAPE),\n/* harmony export */ P8P_TABLE_CONFIG_PROPS: () => (/* binding */ P8P_TABLE_CONFIG_PROPS),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_table */ \"./app/components/p8p_table.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Обёртки для компонент, обеспечивающие подключение их к настройкам приложения\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Вспомогательные процедуры и функции\n //Текстовые ресурсы и константы\n //Меню панелей\n //Рабочее пространство\n //Таблица данных\n //Таблица данных\n //Диаграмма Ганта\n\n//---------\n//Константы\n//---------\n\n//Конфигурируемые свойства \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8P_PANELS_MENU_GRID_CONFIG_PROPS = {\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE,\n defaultGroupTytle: _app_text__WEBPACK_IMPORTED_MODULE_2__.TITLES.DEFAULT_PANELS_GROUP\n};\n\n//Конфигурируемые свойства \"Рабочего пространства\" (P8PAppWorkspace)\nconst P8P_APP_WORKSPACE_CONFIG_PROPS = {\n closeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLOSE,\n homeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE_HOME\n};\n\n//Конфигурируемые свойства \"Таблицы\" (P8PTable)\nconst P8P_TABLE_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND\n};\n\n//Конфигурируемые свойства \"Таблицы данных\" (P8PDataGrid)\nconst P8P_DATA_GRID_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n objectsCopier: _core_utils__WEBPACK_IMPORTED_MODULE_1__.deepCopyObject\n};\n\n//Конфигурируемые свойства \"Диаграммы Ганта\" (P8PGantt)\nconst P8P_GANTT_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n numbTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NUMB,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n startTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.START,\n endTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.END,\n progressTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.PROGRESS,\n legendTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.LEGEND,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//-----------------------\n//Вспомогательные функции\n//-----------------------\n\n//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов\nconst addConfigChildProps = children => react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(child)) return child;\n const {\n children,\n ...restProps\n } = child.props;\n let configProps = {};\n if (child.type.name === \"P8PPanelsMenuGrid\") configProps = P8P_PANELS_MENU_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PTable\") configProps = P8P_TABLE_CONFIG_PROPS;\n if (child.type.name === \"P8PDataGrid\") configProps = P8P_DATA_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PGantt\") configProps = P8P_GANTT_CONFIG_PROPS;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(child.type, {\n ...configProps,\n ...restProps\n }, addConfigChildProps(children));\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для компонента \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8PPanelsMenuGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8PPanelsMenuGrid, _extends({}, P8P_PANELS_MENU_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Рабочее пространство\" (P8PAppWorkspace)\nconst P8PAppWorkspaceConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, P8P_APP_WORKSPACE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица\" (P8PTable)\nconst P8PTableConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8PTable, _extends({}, P8P_TABLE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица данных\" (P8PDataGrid)\nconst P8PDataGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, P8P_DATA_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Диаграмма Ганта\" (P8PGantt)\nconst P8PGanttConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Универсальный элемент-обёртка в параметры конфигурации\nconst ConfigWrapper = ({\n children\n}) => addConfigChildProps(children);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/config_wrapper.js?"); /***/ }), @@ -3183,7 +3293,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ApplicationContext: () => (/* binding */ ApplicationContext),\n/* harmony export */ \"ApplicationСtx\": () => (/* binding */ ApplicationСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _application_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./application_reducer */ \"./app/context/application_reducer.js\");\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/context/backend.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Редьюсер состояния\n //Контекст отображения сообщений\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Клиентский API \"ПАРУС 8 Онлайн\"\nconst P8O_API = window.top?.parus?.clientApi;\n\n//Структура объекта с описанием ошибок\nconst APPLICATION_CONTEXT_ERRORS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n P8O_API_UNAVAILABLE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст приложения\nconst ApplicationСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста приложения\nconst ApplicationContext = ({\n errors,\n displaySizeGetter,\n guidGenerator,\n config,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_application_reducer__WEBPACK_IMPORTED_MODULE_1__.applicationReducer, (0,_application_reducer__WEBPACK_IMPORTED_MODULE_1__.INITIAL_STATE)(displaySizeGetter));\n\n //Подключение к контексту взаимодействия с сервером\n const {\n getConfig,\n getRespPayload\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту отображения сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Установка флага инициализированности приложения\n const setInitialized = () => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_INITIALIZED\n });\n\n //Установка текущего размера экрана\n const setDisplaySize = displaySize => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_DISPLAY_SIZE,\n payload: displaySize\n });\n\n //Установка базового URL приложения\n const setUrlBase = urlBase => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_URL_BASE,\n payload: urlBase\n });\n\n //Установка списка панелей\n const setPanels = panels => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.LOAD_PANELS,\n payload: panels\n });\n\n //Поиск раздела по имени\n const findPanelByName = name => state.panels.find(panel => panel.name == name);\n\n //Отображение закладки \"ПАРУС 8 Онлайн\" с указанным URL\n const pOnlineShowTab = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n url,\n caption,\n onClose\n }) => {\n if (P8O_API) {\n const _id = id || guidGenerator();\n P8O_API.ui.openTab({\n id: _id,\n url,\n caption,\n onClose: () => onClose ? onClose(_id) : null\n });\n return _id;\n } else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение раздела \"ПАРУС 8 Онлайн\"\n const pOnlineShowUnit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение документа \"ПАРУС 8 Онлайн\"\n const pOnlineShowDocument = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n document,\n showMethod = \"main\",\n inRnParameter = \"in_RN\"\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение словаря \"ПАРУС 8 Онлайн\"\n const pOnlineShowDictionary = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.openDictionary({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательской процедуры \"ПАРУС 8 Онлайн\"\n const pOnlineUserProcedure = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.performUserProcedureSync({\n code,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательского отчёта \"ПАРУС 8 Онлайн\"\n const pOnlineUserReport = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.performUserReport({\n code,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Получение количества записей на странице\n const configSystemPageSize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);\n\n //Получение базового URL приложения\n const configUrlBase = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => state.urlBase, [state.urlBase]);\n\n //Инициализация приложения\n const initApp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Читаем конфигурацию с сервера\n let res = await getConfig();\n //Сохраняем базовый URL приложения\n setUrlBase(getRespPayload(res)?.Panels?.urlBase);\n //Сохраняем список панелей\n setPanels(getRespPayload(res)?.Panels?.Panel);\n //Установим флаг завершения инициализации\n setInitialized();\n }, [getConfig, getRespPayload]);\n\n //Обработка подключения контекста к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!state.initialized) {\n //Слушаем изменение размеров окна\n window.addEventListener(\"resize\", () => {\n if (displaySizeGetter) setDisplaySize(displaySizeGetter());\n });\n //Инициализируем приложение\n initApp();\n }\n }, [state.initialized, initApp, displaySizeGetter]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ApplicationСtx.Provider, {\n value: {\n findPanelByName,\n pOnlineShowTab,\n pOnlineShowUnit,\n pOnlineShowDocument,\n pOnlineShowDictionary,\n pOnlineUserProcedure,\n pOnlineUserReport,\n configSystemPageSize,\n configUrlBase,\n appState: state\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста приложения\nApplicationContext.propTypes = {\n errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,\n displaySizeGetter: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func),\n guidGenerator: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired,\n config: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object).isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ApplicationContext: () => (/* binding */ ApplicationContext),\n/* harmony export */ \"ApplicationСtx\": () => (/* binding */ ApplicationСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _application_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./application_reducer */ \"./app/context/application_reducer.js\");\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/context/backend.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Приложение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Редьюсер состояния\n //Контекст отображения сообщений\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Клиентский API \"ПАРУС 8 Онлайн\"\nconst P8O_API = window.top?.parus?.clientApi;\n\n//Структура объекта с описанием ошибок\nconst APPLICATION_CONTEXT_ERRORS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n P8O_API_UNAVAILABLE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст приложения\nconst ApplicationСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста приложения\nconst ApplicationContext = ({\n errors,\n displaySizeGetter,\n guidGenerator,\n config,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_application_reducer__WEBPACK_IMPORTED_MODULE_1__.applicationReducer, (0,_application_reducer__WEBPACK_IMPORTED_MODULE_1__.INITIAL_STATE)(displaySizeGetter));\n\n //Подключение к контексту взаимодействия с сервером\n const {\n getConfig,\n getRespPayload\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту отображения сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Установка флага инициализированности приложения\n const setInitialized = () => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_INITIALIZED\n });\n\n //Установка текущего размера экрана\n const setDisplaySize = displaySize => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_DISPLAY_SIZE,\n payload: displaySize\n });\n\n //Установка базового URL приложения\n const setUrlBase = urlBase => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_URL_BASE,\n payload: urlBase\n });\n\n //Установка списка панелей\n const setPanels = panels => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.LOAD_PANELS,\n payload: panels\n });\n\n //Поиск раздела по имени\n const findPanelByName = name => state.panels.find(panel => panel.name == name);\n\n //Отображение закладки \"ПАРУС 8 Онлайн\" с указанным URL\n const pOnlineShowTab = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n url,\n caption,\n onClose\n }) => {\n if (P8O_API) {\n const _id = id || guidGenerator();\n P8O_API.ui.openTab({\n id: _id,\n url,\n caption,\n onClose: () => onClose ? onClose(_id) : null\n });\n return _id;\n } else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение раздела \"ПАРУС 8 Онлайн\"\n const pOnlineShowUnit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение документа \"ПАРУС 8 Онлайн\"\n const pOnlineShowDocument = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n document,\n showMethod = \"main\",\n inRnParameter = \"in_RN\"\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение словаря \"ПАРУС 8 Онлайн\"\n const pOnlineShowDictionary = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.openDictionary({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательской процедуры \"ПАРУС 8 Онлайн\"\n const pOnlineUserProcedure = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.performUserProcedureSync({\n code,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательского отчёта \"ПАРУС 8 Онлайн\"\n const pOnlineUserReport = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.performUserReport({\n code,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Получение количества записей на странице\n const configSystemPageSize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);\n\n //Получение базового URL приложения\n const configUrlBase = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => state.urlBase, [state.urlBase]);\n\n //Инициализация приложения\n const initApp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Читаем конфигурацию с сервера\n let res = await getConfig();\n //Сохраняем базовый URL приложения\n setUrlBase(getRespPayload(res)?.Panels?.urlBase);\n //Сохраняем список панелей\n setPanels(getRespPayload(res)?.Panels?.Panel);\n //Установим флаг завершения инициализации\n setInitialized();\n }, [getConfig, getRespPayload]);\n\n //Обработка подключения контекста к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!state.initialized) {\n //Слушаем изменение размеров окна\n window.addEventListener(\"resize\", () => {\n if (displaySizeGetter) setDisplaySize(displaySizeGetter());\n });\n //Инициализируем приложение\n initApp();\n }\n }, [state.initialized, initApp, displaySizeGetter]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ApplicationСtx.Provider, {\n value: {\n findPanelByName,\n pOnlineShowTab,\n pOnlineShowUnit,\n pOnlineShowDocument,\n pOnlineShowDictionary,\n pOnlineUserProcedure,\n pOnlineUserReport,\n configSystemPageSize,\n configUrlBase,\n appState: state\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста приложения\nApplicationContext.propTypes = {\n errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,\n displaySizeGetter: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func),\n guidGenerator: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired,\n config: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object).isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application.js?"); /***/ }), @@ -3194,7 +3304,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APP_AT: () => (/* binding */ APP_AT),\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ applicationReducer: () => (/* binding */ applicationReducer)\n/* harmony export */ });\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Приложение - редьюсер состояния\r\n*/\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst APP_AT = {\n SET_URL_BASE: \"SET_URL_BASE\",\n //Установка базового URL приложения\n LOAD_PANELS: \"LOAD_PANELS\",\n //Загрузка списка панелей\n SET_INITIALIZED: \"SET_INITIALIZED\",\n //Установка флага инициализированности приложения\n SET_DISPLAY_SIZE: \"SET_DISPLAY_SIZE\" //Установка текущего типового размера экрана\n};\n\n//Состояние приложения по умолчанию\nconst INITIAL_STATE = displaySizeGetter => ({\n displaySize: displaySizeGetter(),\n urlBase: \"\",\n panels: [],\n panelsLoaded: false,\n initialized: false\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Установка базового URL приложения\n [APP_AT.SET_URL_BASE]: (state, {\n payload\n }) => ({\n ...state,\n urlBase: payload\n }),\n //Загрузка списка панелей\n [APP_AT.LOAD_PANELS]: (state, {\n payload\n }) => {\n let panels = [];\n if (payload && Array.isArray(payload)) for (let p of payload) panels.push({\n ...p\n });\n return {\n ...state,\n panels,\n panelsLoaded: true\n };\n },\n //Установка текущего типового размера экрана\n [APP_AT.SET_INITIALIZED]: state => ({\n ...state,\n initialized: true\n }),\n //Установка текущего типового размера экрана\n [APP_AT.SET_DISPLAY_SIZE]: (state, {\n payload\n }) => ({\n ...state,\n displaySize: payload\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst applicationReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application_reducer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APP_AT: () => (/* binding */ APP_AT),\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ applicationReducer: () => (/* binding */ applicationReducer)\n/* harmony export */ });\n/*\n Парус 8 - Панели мониторинга\n Контекст: Приложение - редьюсер состояния\n*/\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst APP_AT = {\n SET_URL_BASE: \"SET_URL_BASE\",\n //Установка базового URL приложения\n LOAD_PANELS: \"LOAD_PANELS\",\n //Загрузка списка панелей\n SET_INITIALIZED: \"SET_INITIALIZED\",\n //Установка флага инициализированности приложения\n SET_DISPLAY_SIZE: \"SET_DISPLAY_SIZE\" //Установка текущего типового размера экрана\n};\n\n//Состояние приложения по умолчанию\nconst INITIAL_STATE = displaySizeGetter => ({\n displaySize: displaySizeGetter(),\n urlBase: \"\",\n panels: [],\n panelsLoaded: false,\n initialized: false\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Установка базового URL приложения\n [APP_AT.SET_URL_BASE]: (state, {\n payload\n }) => ({\n ...state,\n urlBase: payload\n }),\n //Загрузка списка панелей\n [APP_AT.LOAD_PANELS]: (state, {\n payload\n }) => {\n let panels = [];\n if (payload && Array.isArray(payload)) for (let p of payload) panels.push({\n ...p\n });\n return {\n ...state,\n panels,\n panelsLoaded: true\n };\n },\n //Установка текущего типового размера экрана\n [APP_AT.SET_INITIALIZED]: state => ({\n ...state,\n initialized: true\n }),\n //Установка текущего типового размера экрана\n [APP_AT.SET_DISPLAY_SIZE]: (state, {\n payload\n }) => ({\n ...state,\n displaySize: payload\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst applicationReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application_reducer.js?"); /***/ }), @@ -3205,7 +3315,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BackEndContext: () => (/* binding */ BackEndContext),\n/* harmony export */ \"BackEndСtx\": () => (/* binding */ BackEndСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Взаимодействие с серверным API\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Контекст сообщений\n\n//---------\n//Константы\n//---------\n\n//Структура объекта клиента\nconst BACKEND_CONTEXT_CLIENT_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n SERV_DATA_TYPE_STR: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_NUMB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_DATE: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_CLOB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n isRespErr: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespErrMessage: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespPayload: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n executeStored: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getConfig: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст взаимодействия с серверным API\nconst BackEndСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста взаимодействия с серверным API\nconst BackEndContext = ({\n client,\n children\n}) => {\n //Подключение к контексту сообщений\n const {\n showLoader,\n hideLoader,\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Проверка ответа на наличие ошибки\n const isRespErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.isRespErr(resp), [client]);\n\n //Извлечение ошибки из ответа\n const getRespErrMessage = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespErrMessage(resp), [client]);\n\n //Извлечение полезного содержимого из ответа\n const getRespPayload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespPayload(resp), [client]);\n\n //Запуск хранимой процедуры\n const executeStored = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true,\n fullResponse = false,\n spreadOutArguments = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.executeStored({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError,\n spreadOutArguments\n });\n if (fullResponse === true || isRespErr(result)) return result;else return result.XPAYLOAD;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, isRespErr, showMsgErr, client]);\n\n //Загрузка настроек панелей\n const getConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.getConfig({\n throwError\n });\n return result;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, showMsgErr, client]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BackEndСtx.Provider, {\n value: {\n SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE: client.SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB: client.SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста взаимодействия с серверным API\nBackEndContext.propTypes = {\n client: BACKEND_CONTEXT_CLIENT_SHAPE.isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/backend.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BackEndContext: () => (/* binding */ BackEndContext),\n/* harmony export */ \"BackEndСtx\": () => (/* binding */ BackEndСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Взаимодействие с серверным API\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Контекст сообщений\n\n//---------\n//Константы\n//---------\n\n//Структура объекта клиента\nconst BACKEND_CONTEXT_CLIENT_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n SERV_DATA_TYPE_STR: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_NUMB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_DATE: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_CLOB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n isRespErr: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespErrMessage: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespPayload: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n executeStored: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getConfig: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст взаимодействия с серверным API\nconst BackEndСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста взаимодействия с серверным API\nconst BackEndContext = ({\n client,\n children\n}) => {\n //Подключение к контексту сообщений\n const {\n showLoader,\n hideLoader,\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Проверка ответа на наличие ошибки\n const isRespErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.isRespErr(resp), [client]);\n\n //Извлечение ошибки из ответа\n const getRespErrMessage = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespErrMessage(resp), [client]);\n\n //Извлечение полезного содержимого из ответа\n const getRespPayload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespPayload(resp), [client]);\n\n //Запуск хранимой процедуры\n const executeStored = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true,\n fullResponse = false,\n spreadOutArguments = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.executeStored({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError,\n spreadOutArguments\n });\n if (fullResponse === true || isRespErr(result)) return result;else return result.XPAYLOAD;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, isRespErr, showMsgErr, client]);\n\n //Загрузка настроек панелей\n const getConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.getConfig({\n throwError\n });\n return result;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, showMsgErr, client]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BackEndСtx.Provider, {\n value: {\n SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE: client.SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB: client.SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста взаимодействия с серверным API\nBackEndContext.propTypes = {\n client: BACKEND_CONTEXT_CLIENT_SHAPE.isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/backend.js?"); /***/ }), @@ -3216,7 +3326,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MessagingContext: () => (/* binding */ MessagingContext),\n/* harmony export */ \"MessagingСtx\": () => (/* binding */ MessagingСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/p8p_app_progress */ \"./app/components/p8p_app_progress.js\");\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./messaging_reducer */ \"./app/context/messaging_reducer.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Сообщения\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Индикатор процесса\n //Диалог сообщения\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Структура объекта с описанием типовых заголовков\nconst MESSAGING_CONTEXT_TITLES_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n ERR: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n WARN: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n INFO: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых текстов\nconst MESSAGING_CONTEXT_TEXTS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n LOADING: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых кнопок\nconst MESSAGING_CONTEXT_BUTTONS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n CLOSE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n OK: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n CANCEL: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст сообщений\nconst MessagingСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста сообщений\nconst MessagingContext = ({\n titles,\n texts,\n buttons,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.messagingReducer, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.INITIAL_STATE);\n\n //Отображение загрузчика\n const showLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(message => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_LOADER,\n payload: message\n }), []);\n\n //Сокрытие загрузчика\n const hideLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_LOADER\n }), []);\n\n //Отображение сообщения\n const showMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((type, text, msgOnOk = null, msgOnCancel = null) => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_MSG,\n payload: {\n type,\n text,\n msgOnOk,\n msgOnCancel\n }\n }), []);\n\n //Отображение сообщения - ошибка\n const showMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - информация\n const showMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - предупреждение\n const showMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null, msgOnCancel = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN, text, msgOnOk, msgOnCancel), [showMsg]);\n\n //Сокрытие сообщения\n const hideMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((cancel = false) => {\n dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_MSG\n });\n if (!cancel && state.msgOnOk) state.msgOnOk();\n if (cancel && state.msgOnCancel) state.msgOnCancel();\n }, [state]);\n\n //Отработка нажатия на \"ОК\" в сообщении\n const handleMessageOkClick = () => {\n hideMsg(false);\n };\n\n //Отработка нажатия на \"Отмена\" в сообщении\n const handleMessageCancelClick = () => {\n hideMsg(true);\n };\n\n //Встраиваемое сообщение\n const InlineMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineMessage)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение об ошибке\n const InlineMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineError)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с информацией\n const InlineMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineInfo)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с предупреждением\n const InlineMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineWarn)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MessagingСtx.Provider, {\n value: {\n MSG_TYPE: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE,\n showLoader,\n hideLoader,\n showMsg,\n showMsgErr,\n showMsgInfo,\n showMsgWarn,\n hideMsg,\n InlineMsg,\n InlineMsgErr,\n InlineMsgInfo,\n InlineMsgWarn,\n msgState: state\n }\n }, state.loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__.P8PAppProgress, {\n open: true,\n text: state.loadingMessage || texts.LOADING\n }) : null, state.msg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppMessage, {\n open: true,\n variant: state.msgType,\n text: state.msgText,\n title: true,\n titleText: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR ? titles.ERR : state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN ? titles.WARN : titles.INFO,\n okBtn: true,\n onOk: handleMessageOkClick,\n okBtnCaption: [_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO].includes(state.msgType) ? buttons.CLOSE : buttons.OK,\n cancelBtn: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN,\n onCancel: handleMessageCancelClick,\n cancelBtnCaption: buttons.CANCEL\n }) : null, children);\n};\n\n//Контроль свойств - Провайдер контекста сообщений\nMessagingContext.propTypes = {\n titles: MESSAGING_CONTEXT_TITLES_SHAPE,\n texts: MESSAGING_CONTEXT_TEXTS_SHAPE,\n buttons: MESSAGING_CONTEXT_BUTTONS_SHAPE,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MessagingContext: () => (/* binding */ MessagingContext),\n/* harmony export */ \"MessagingСtx\": () => (/* binding */ MessagingСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/p8p_app_progress */ \"./app/components/p8p_app_progress.js\");\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./messaging_reducer */ \"./app/context/messaging_reducer.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Сообщения\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Индикатор процесса\n //Диалог сообщения\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Структура объекта с описанием типовых заголовков\nconst MESSAGING_CONTEXT_TITLES_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n ERR: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n WARN: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n INFO: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых текстов\nconst MESSAGING_CONTEXT_TEXTS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n LOADING: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых кнопок\nconst MESSAGING_CONTEXT_BUTTONS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n CLOSE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n OK: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n CANCEL: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст сообщений\nconst MessagingСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста сообщений\nconst MessagingContext = ({\n titles,\n texts,\n buttons,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.messagingReducer, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.INITIAL_STATE);\n\n //Отображение загрузчика\n const showLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(message => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_LOADER,\n payload: message\n }), []);\n\n //Сокрытие загрузчика\n const hideLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_LOADER\n }), []);\n\n //Отображение сообщения\n const showMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((type, text, msgOnOk = null, msgOnCancel = null) => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_MSG,\n payload: {\n type,\n text,\n msgOnOk,\n msgOnCancel\n }\n }), []);\n\n //Отображение сообщения - ошибка\n const showMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - информация\n const showMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - предупреждение\n const showMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null, msgOnCancel = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN, text, msgOnOk, msgOnCancel), [showMsg]);\n\n //Сокрытие сообщения\n const hideMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((cancel = false) => {\n dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_MSG\n });\n if (!cancel && state.msgOnOk) state.msgOnOk();\n if (cancel && state.msgOnCancel) state.msgOnCancel();\n }, [state]);\n\n //Отработка нажатия на \"ОК\" в сообщении\n const handleMessageOkClick = () => {\n hideMsg(false);\n };\n\n //Отработка нажатия на \"Отмена\" в сообщении\n const handleMessageCancelClick = () => {\n hideMsg(true);\n };\n\n //Встраиваемое сообщение\n const InlineMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineMessage)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение об ошибке\n const InlineMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineError)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с информацией\n const InlineMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineInfo)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с предупреждением\n const InlineMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineWarn)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MessagingСtx.Provider, {\n value: {\n MSG_TYPE: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE,\n showLoader,\n hideLoader,\n showMsg,\n showMsgErr,\n showMsgInfo,\n showMsgWarn,\n hideMsg,\n InlineMsg,\n InlineMsgErr,\n InlineMsgInfo,\n InlineMsgWarn,\n msgState: state\n }\n }, state.loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__.P8PAppProgress, {\n open: true,\n text: state.loadingMessage || texts.LOADING\n }) : null, state.msg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppMessage, {\n open: true,\n variant: state.msgType,\n text: state.msgText,\n title: true,\n titleText: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR ? titles.ERR : state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN ? titles.WARN : titles.INFO,\n okBtn: true,\n onOk: handleMessageOkClick,\n okBtnCaption: [_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO].includes(state.msgType) ? buttons.CLOSE : buttons.OK,\n cancelBtn: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN,\n onCancel: handleMessageCancelClick,\n cancelBtnCaption: buttons.CANCEL\n }) : null, children);\n};\n\n//Контроль свойств - Провайдер контекста сообщений\nMessagingContext.propTypes = {\n titles: MESSAGING_CONTEXT_TITLES_SHAPE,\n texts: MESSAGING_CONTEXT_TEXTS_SHAPE,\n buttons: MESSAGING_CONTEXT_BUTTONS_SHAPE,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging.js?"); /***/ }), @@ -3227,7 +3337,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ MSG_AT: () => (/* binding */ MSG_AT),\n/* harmony export */ MSG_TYPE: () => (/* binding */ MSG_TYPE),\n/* harmony export */ messagingReducer: () => (/* binding */ messagingReducer)\n/* harmony export */ });\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Сообщения - редьюсер состояния\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Диалог сообщения\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst MSG_AT = {\n SHOW_LOADER: \"SHOW_LOADER\",\n //Отображение индикатора загрузки\n HIDE_LOADER: \"HIDE_LOADER\",\n //Сокрытие индикатора загрузки\n SHOW_MSG: \"SHOW_MSG\",\n //Отображение сообщения\n HIDE_MSG: \"HIDE_MSG\" //Сокрытие сообщения\n};\n\n//Типы сообщений\nconst MSG_TYPE = {\n INFO: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.INFO,\n //Тип диалога - информация\n WARN: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.WARN,\n //Тип диалога - предупреждение\n ERR: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.ERR //Тип диалога - ошибка\n};\n\n//Состояние сообщений по умолчанию\nconst INITIAL_STATE = {\n loading: false,\n loadingMessage: \"\",\n msg: false,\n msgType: MSG_TYPE.ERR,\n msgText: null,\n msgOnOk: null,\n msgOnCancel: null\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Отображение индикатора обработки данных\n [MSG_AT.SHOW_LOADER]: (state, {\n payload\n }) => ({\n ...state,\n loading: true,\n loadingMessage: payload\n }),\n //Сокрытие индикатора обработки данных\n [MSG_AT.HIDE_LOADER]: state => ({\n ...state,\n loading: false\n }),\n //Отображение сообщения\n [MSG_AT.SHOW_MSG]: (state, {\n payload\n }) => ({\n ...state,\n msg: true,\n msgType: payload.type || MSG_TYPE.APP_ERR,\n msgText: payload.text,\n msgOnOk: payload.msgOnOk,\n msgOnCancel: payload.msgOnCancel\n }),\n //Сокрытие сообщения\n [MSG_AT.HIDE_MSG]: state => ({\n ...state,\n msg: false,\n msgOnOk: null,\n msgOnCancel: null\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst messagingReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging_reducer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ MSG_AT: () => (/* binding */ MSG_AT),\n/* harmony export */ MSG_TYPE: () => (/* binding */ MSG_TYPE),\n/* harmony export */ messagingReducer: () => (/* binding */ messagingReducer)\n/* harmony export */ });\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Сообщения - редьюсер состояния\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Диалог сообщения\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst MSG_AT = {\n SHOW_LOADER: \"SHOW_LOADER\",\n //Отображение индикатора загрузки\n HIDE_LOADER: \"HIDE_LOADER\",\n //Сокрытие индикатора загрузки\n SHOW_MSG: \"SHOW_MSG\",\n //Отображение сообщения\n HIDE_MSG: \"HIDE_MSG\" //Сокрытие сообщения\n};\n\n//Типы сообщений\nconst MSG_TYPE = {\n INFO: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.INFO,\n //Тип диалога - информация\n WARN: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.WARN,\n //Тип диалога - предупреждение\n ERR: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.ERR //Тип диалога - ошибка\n};\n\n//Состояние сообщений по умолчанию\nconst INITIAL_STATE = {\n loading: false,\n loadingMessage: \"\",\n msg: false,\n msgType: MSG_TYPE.ERR,\n msgText: null,\n msgOnOk: null,\n msgOnCancel: null\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Отображение индикатора обработки данных\n [MSG_AT.SHOW_LOADER]: (state, {\n payload\n }) => ({\n ...state,\n loading: true,\n loadingMessage: payload\n }),\n //Сокрытие индикатора обработки данных\n [MSG_AT.HIDE_LOADER]: state => ({\n ...state,\n loading: false\n }),\n //Отображение сообщения\n [MSG_AT.SHOW_MSG]: (state, {\n payload\n }) => ({\n ...state,\n msg: true,\n msgType: payload.type || MSG_TYPE.APP_ERR,\n msgText: payload.text,\n msgOnOk: payload.msgOnOk,\n msgOnCancel: payload.msgOnCancel\n }),\n //Сокрытие сообщения\n [MSG_AT.HIDE_MSG]: state => ({\n ...state,\n msg: false,\n msgOnOk: null,\n msgOnCancel: null\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst messagingReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging_reducer.js?"); /***/ }), @@ -3238,7 +3348,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NavigationContext: () => (/* binding */ NavigationContext),\n/* harmony export */ NavigationCtx: () => (/* binding */ NavigationCtx),\n/* harmony export */ getRootLocation: () => (/* binding */ getRootLocation)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! query-string */ \"./node_modules/query-string/index.js\");\n/* harmony import */ var _application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./application */ \"./app/context/application.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Навигация\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Роутер приложения\n //Работа со строкой запроса\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Типовые пути\nconst PATHS = {\n ROOT: \"/\" //Корень приложения\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Получение корневого пути\nconst getRootLocation = () => PATHS.ROOT;\n\n//Контекст навигации\nconst NavigationCtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста навигации\nconst NavigationContext = ({\n children\n}) => {\n //Подключение к объекту роутера для управления навигацией\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useLocation)();\n\n //Подключение к объекту роутера для управления навигацией\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate)();\n\n //Подключение к контексту приложения\n const {\n findPanelByName\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Проверка наличия параметров запроса\n const isNavigationSearch = () => location.search ? true : false;\n\n //Считываение параметров запроса\n const getNavigationSearch = () => query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].parse(location.search);\n\n //Проверка наличия параметров запроса (передаваемых через состояние)\n const isNavigationState = () => location.state ? true : false;\n\n //Считываение параметров запроса (передаваемых через состояние)\n const getNavigationState = () => isNavigationState() ? JSON.parse(location.state) : null;\n\n //Обновление текущей страницы\n const refresh = () => window.location.reload();\n\n //Возврат на предыдущую страницу\n const navigateBack = () => navigate(-1);\n\n //Переход к адресу внутри приложения\n const navigateTo = ({\n path,\n search,\n state,\n replace = false\n }) => {\n //Если указано куда переходить\n if (path) {\n //Переходим к адресу\n if (state) navigate(path, {\n state: JSON.stringify(state),\n replace\n });else navigate({\n pathname: path,\n search: query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].stringify(search),\n replace\n });\n //Флаг успешного перехода\n return true;\n }\n //Переход не состоялся\n else return false;\n };\n\n //Переход к домашней страничке\n const navigateRoot = state => navigateTo({\n path: getRootLocation(),\n state\n });\n\n //Переход к панели\n const navigatePanel = (panel, state) => {\n if (panel) {\n let path = getRootLocation();\n path = !path.endsWith(\"/\") && !panel.url.startsWith(\"/\") ? `${path}/${panel.url}` : `${path}${panel.url}`;\n navigateTo({\n path,\n state\n });\n } else return false;\n };\n\n //Переход к панели по наименованию\n const navigatePanelByName = (name, state) => navigatePanel(findPanelByName(name), state);\n\n //Переход к произвольному адресу\n const navigateURL = url => {\n window.open(url, \"_self\");\n };\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(NavigationCtx.Provider, {\n value: {\n getNavigationSearch,\n isNavigationSearch,\n getNavigationState,\n isNavigationState,\n refresh,\n navigateTo,\n navigateBack,\n navigateRoot,\n navigatePanel,\n navigatePanelByName,\n navigateURL\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста навигации\nNavigationContext.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/navigation.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NavigationContext: () => (/* binding */ NavigationContext),\n/* harmony export */ NavigationCtx: () => (/* binding */ NavigationCtx),\n/* harmony export */ getRootLocation: () => (/* binding */ getRootLocation)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! query-string */ \"./node_modules/query-string/index.js\");\n/* harmony import */ var _application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./application */ \"./app/context/application.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Навигация\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Роутер приложения\n //Работа со строкой запроса\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Типовые пути\nconst PATHS = {\n ROOT: \"/\" //Корень приложения\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Получение корневого пути\nconst getRootLocation = () => PATHS.ROOT;\n\n//Контекст навигации\nconst NavigationCtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста навигации\nconst NavigationContext = ({\n children\n}) => {\n //Подключение к объекту роутера для управления навигацией\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useLocation)();\n\n //Подключение к объекту роутера для управления навигацией\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate)();\n\n //Подключение к контексту приложения\n const {\n findPanelByName\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Проверка наличия параметров запроса\n const isNavigationSearch = () => location.search ? true : false;\n\n //Считываение параметров запроса\n const getNavigationSearch = () => query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].parse(location.search);\n\n //Проверка наличия параметров запроса (передаваемых через состояние)\n const isNavigationState = () => location.state ? true : false;\n\n //Считываение параметров запроса (передаваемых через состояние)\n const getNavigationState = () => isNavigationState() ? JSON.parse(location.state) : null;\n\n //Обновление текущей страницы\n const refresh = () => window.location.reload();\n\n //Возврат на предыдущую страницу\n const navigateBack = () => navigate(-1);\n\n //Переход к адресу внутри приложения\n const navigateTo = ({\n path,\n search,\n state,\n replace = false\n }) => {\n //Если указано куда переходить\n if (path) {\n //Переходим к адресу\n if (state) navigate(path, {\n state: JSON.stringify(state),\n replace\n });else navigate({\n pathname: path,\n search: query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].stringify(search),\n replace\n });\n //Флаг успешного перехода\n return true;\n }\n //Переход не состоялся\n else return false;\n };\n\n //Переход к домашней страничке\n const navigateRoot = state => navigateTo({\n path: getRootLocation(),\n state\n });\n\n //Переход к панели\n const navigatePanel = (panel, state) => {\n if (panel) {\n let path = getRootLocation();\n path = !path.endsWith(\"/\") && !panel.url.startsWith(\"/\") ? `${path}/${panel.url}` : `${path}${panel.url}`;\n navigateTo({\n path,\n state\n });\n } else return false;\n };\n\n //Переход к панели по наименованию\n const navigatePanelByName = (name, state) => navigatePanel(findPanelByName(name), state);\n\n //Переход к произвольному адресу\n const navigateURL = url => {\n window.open(url, \"_self\");\n };\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(NavigationCtx.Provider, {\n value: {\n getNavigationSearch,\n isNavigationSearch,\n getNavigationState,\n isNavigationState,\n refresh,\n navigateTo,\n navigateBack,\n navigateRoot,\n navigatePanel,\n navigatePanelByName,\n navigateURL\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста навигации\nNavigationContext.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/navigation.js?"); /***/ }), @@ -3249,7 +3359,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\nconst ERR_UNAUTH = \"Сеанс завершен. Пройдите аутентификацию повторно.\"; //Ошибка аутентификации\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGROUPS\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (isArray) opts.isArray = isArray;\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Проверим на наличие редиректа к аутентификации (возникает, если сеанс окончен)\n if (response.redirected && response.url.toLowerCase().includes(\"auth?returnurl\")) throw new Error(ERR_UNAUTH);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(responseJSON.XRESPOND);\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false),\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/*\n Парус 8 - Панели мониторинга\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (isArray) opts.isArray = isArray;\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(responseJSON.XRESPOND);\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false),\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); /***/ }), @@ -3260,7 +3370,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\n Парус 8 - Панели мониторинга\n Ядро: Вспомогательные функции\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); /***/ }), @@ -3271,7 +3381,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"./node_modules/react-dom/client.js\");\n/* harmony import */ var _root__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./root */ \"./app/root.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Точка входа в приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //React\n //Работа с DOM в React\n //Корневой компонент приложения\n\n//-----------\n//Точка входа\n//-----------\n\nconst root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(document.getElementById(\"app-content\"));\nroot.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_root__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"./node_modules/react-dom/client.js\");\n/* harmony import */ var _root__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./root */ \"./app/root.js\");\n/*\n Парус 8 - Панели мониторинга\n Точка входа в приложение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //React\n //Работа с DOM в React\n //Корневой компонент приложения\n\n//-----------\n//Точка входа\n//-----------\n\nconst root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(document.getElementById(\"app-content\"));\nroot.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_root__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/index.js?"); + +/***/ }), + +/***/ "./app/panels/alex/alex.js": +/*!*********************************!*\ + !*** ./app/panels/alex/alex.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Alex: () => (/* binding */ Alex)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/*\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\n Панель мониторинга: Описание макета (пользовательская инструкция)\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Текстовые ресурсы\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n IMG_CONT: {\n textAlign: \"center\",\n padding: \"10px\"\n },\n IMG: {\n maxWidth: \"100%\",\n height: \"auto\"\n },\n PRGF_TABLE: {\n paddingTop: \"20px\",\n paddingBottom: \"20px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n TABLE: {\n width: \"80%\"\n },\n TABLE_TITLE: {\n backgroundColor: \"lightgray\"\n },\n TABLE_SUBTITLE: {\n textAlign: \"center\",\n backgroundColor: \"#f3eded\",\n fontWeight: \"bold\"\n },\n FAB_BACK: {\n position: \"absolute\",\n right: \"20px\",\n marginTop: \"20px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst Alex = () => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"1234\");\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/alex/alex.js?"); + +/***/ }), + +/***/ "./app/panels/alex/index.js": +/*!**********************************!*\ + !*** ./app/panels/alex/index.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _alex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./alex */ \"./app/panels/alex/alex.js\");\n/*\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\n Панель мониторинга: Описание макета (пользовательская инструкция)\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель пользовательской инструкции\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _alex__WEBPACK_IMPORTED_MODULE_0__.Alex;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/alex/index.js?"); /***/ }), @@ -3297,25 +3429,135 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./app/panels/eqs_prfrm/eqs_prfrm.js": -/*!*******************************************!*\ - !*** ./app/panels/eqs_prfrm/eqs_prfrm.js ***! - \*******************************************/ +/***/ "./app/panels/mech_rec_cost_prod_plans/hooks.js": +/*!******************************************************!*\ + !*** ./app/panels/mech_rec_cost_prod_plans/hooks.js ***! + \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"\\u0412\\u044B\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D\\u0438\\u0435 \\u0440\\u0430\\u0431\\u043E\\u0442 \\u0422\\u041E\\u0438\\u0420\");\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlans: () => (/* binding */ useFilteredPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nconst useFilteredPlans = (plans, filter) => {\n const filteredPlans = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); /***/ }), -/***/ "./app/panels/eqs_prfrm/index.js": -/*!***************************************!*\ - !*** ./app/panels/eqs_prfrm/index.js ***! - \***************************************/ +/***/ "./app/panels/mech_rec_cost_prod_plans/index.js": +/*!******************************************************!*\ + !*** ./app/panels/mech_rec_cost_prod_plans/index.js ***! + \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _eqs_prfrm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./eqs_prfrm */ \"./app/panels/eqs_prfrm/eqs_prfrm.js\");\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель выполнения работ\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _eqs_prfrm__WEBPACK_IMPORTED_MODULE_0__.EqsPrfrm;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _mech_rec_cost_prod_plans__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mech_rec_cost_prod_plans */ \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель производственной программы\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _mech_rec_cost_prod_plans__WEBPACK_IMPORTED_MODULE_0__.MechRecCostProdPlans;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/index.js?"); + +/***/ }), + +/***/ "./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js": +/*!******************************************************************************!*\ + !*** ./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//Список проектов\nconst ProjectsList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PROJECTS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n })\n })))));\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanCurLevel: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanCurLevel: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanCurLevel: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (curMaxLevel = null, level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n let maxLevel = curMaxLevel ? curMaxLevel : 0;\n //Если есть данные\n if (data.XGANTT_TASKS) {\n //Обходим данные\n data.XGANTT_TASKS.forEach(el => {\n // Если есть зависимости\n if (el.dependencies) {\n //Разбиваем их в array\n el.dependencies = el.dependencies[0].split(\",\");\n }\n //Если уровень больше рассчитанного максимального\n maxLevel = maxLevel < el.level ? el.level : maxLevel;\n });\n }\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: maxLevel,\n selectedPlanCurLevel: level || level === 0 ? level : maxLevel,\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(data?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(state.selectedPlanMaxLevel, selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanCurLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanCurLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanCurLevel\n }, [...Array(state.selectedPlanMaxLevel + 1).keys()].map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans_copy.js?"); + +/***/ }), + +/***/ "./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js": +/*!*************************************************************************!*\ + !*** ./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//Список проектов\nconst ProjectsList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PROJECTS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n })\n })))));\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Разбор XML\nconst parseXML = (xmlDoc, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__.XMLParser(opts);\n const data = parser.parse(xmlDoc);\n resolve(data.XDATA);\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseXML(data.COUT, (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val);\n console.log(doc.XGANTT_DEF);\n console.log(doc.XGANTT_TASKS);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/TabsElements/agentChart.js": +/*!************************************************************!*\ + !*** ./app/panels/prj_agn_info/TabsElements/agentChart.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentChart: () => (/* binding */ AgentChart)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable react/prop-types */\n\n //Интерфейсные элементы\n //График\n\nconst AgentChart = ({\n chart,\n pOnlineShowUnit\n}) => {\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n pOnlineShowUnit({\n unitCode: \"PayNotes\",\n showMethod: \"SelectList\",\n inputParameters: [{\n name: item.SCOND,\n value: item.NIDENT\n }]\n });\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, chart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__.P8PChart, _extends({}, chart, {\n onClick: handleChartClick,\n style: {\n minWidth: \"40vw\",\n maxHeight: \"30vw\",\n minHeight: \"405px\",\n display: \"flex\",\n justifyContent: \"center\"\n }\n })) : null));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/TabsElements/agentChart.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/TabsElements/agentContracts.js": +/*!****************************************************************!*\ + !*** ./app/panels/prj_agn_info/TabsElements/agentContracts.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentContracts: () => (/* binding */ AgentContracts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../config_wrapper */ \"./app/config_wrapper.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable react/prop-types */\n\n //Интерфейсные элементы\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n\nconst AgentContracts = ({\n dataGrid,\n setDataGrid,\n pOnlineShowDocument\n}) => {\n //Генерация представления ячейки c данными\n const dataCellRender = ({\n row,\n columnDef\n }) => {\n switch (columnDef.name) {\n case \"NDOC_SUM\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"Contracts\",\n document: row[\"NRN\"]\n })\n }, row[columnDef.name])\n };\n }\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n textAlign: \"center\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n dataCellRender: dataCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n }))))));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/TabsElements/agentContracts.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/TabsElements/agentInfo.js": +/*!***********************************************************!*\ + !*** ./app/panels/prj_agn_info/TabsElements/agentInfo.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentInfo: () => (/* binding */ AgentInfo)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* eslint-disable react/prop-types */\n\n //Интерфейсные элементы\n\nconst makeInfoByCond = (blockName, infoValue) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, infoValue ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n variant: \"body2\",\n component: \"div\",\n sx: {\n textAlign: \"justify\",\n paddingTop: \"5px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, blockName, \":\"), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), infoValue) : null);\n};\nconst AgentInfo = ({\n agentInfo,\n pOnlineShowDocument\n}) => {\n //При нажатии перехода на контрагента\n const handleAgnetClick = id => pOnlineShowDocument({\n unitCode: \"AGNLIST\",\n document: id\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n minHeight: \"510px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: {\n minHeight: \"457px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n variant: \"h5\",\n component: \"div\",\n sx: {\n fontSize: 16,\n fontWeight: \"bold\"\n },\n gutterBottom: true\n }, agentInfo.AGNNAME), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: {\n display: \"flex\",\n alignItems: \"flex-end\",\n flexDirection: \"column\",\n bgcolor: \"background.paper\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null, \"\\u0418\\u041D\\u041D: \", agentInfo.AGNIDNUMB), agentInfo.ORGCODE ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null, \"\\u041E\\u041A\\u041F\\u041E: \", agentInfo.ORGCODE) : null), makeInfoByCond(\"Мнемокод\", agentInfo.AGNABBR), makeInfoByCond(\"Наименование\", agentInfo.AGNNAME), makeInfoByCond(\"Полное наименование\", agentInfo.FULLNAME), makeInfoByCond(\"Адрес\", agentInfo.ADDRESS)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n alignItems: \"flex-end\",\n justifyContent: \"flex-end\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"contained\",\n onClick: () => handleAgnetClick(agentInfo.NRN)\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0439\\u0442\\u0438 \\u043A \\u043A\\u043E\\u043D\\u0442\\u0440\\u0430\\u0433\\u0435\\u043D\\u0442\\u0443\"))));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/TabsElements/agentInfo.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/back.js": +/*!*****************************************!*\ + !*** ./app/panels/prj_agn_info/back.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearSelectList: () => (/* binding */ clearSelectList),\n/* harmony export */ useAgent: () => (/* binding */ useAgent),\n/* harmony export */ useAgnlist: () => (/* binding */ useAgnlist),\n/* harmony export */ useTabs: () => (/* binding */ useTabs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n\n\nconst useAgnlist = executeStored => {\n //Список контрагентов\n const [agents, setAgents] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n const agentsGet = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async SREGEXP => {\n //Считываем список контрагентов\n const data = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGNLIST_GET\",\n args: {\n SREGEXP: SREGEXP\n },\n respArg: \"COUT\"\n });\n //Если есть данные\n if (data.AGENTS) {\n setAgents(data.AGENTS.length > 1 ? [...data.AGENTS] : [data.AGENTS]);\n } else {\n setAgents([]);\n }\n }, [executeStored]);\n return [agents, agentsGet];\n};\n\n//Информация о контрагенте\nconst useAgent = executeStored => {\n //Информация о контрагенте\n const [agentInfo, setAgentInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Инициализация информации о контрагенте\n const agentInfoGet = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n const data = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGNLIST_INFO_GET\",\n args: {\n NRN: NRN\n },\n respArg: \"COUT\"\n });\n //Устанавливаем информацию о контрагенте\n setAgentInfo(data.AGENT_INFO);\n }, [executeStored]);\n return [agentInfo, agentInfoGet];\n};\n\n//Информация для закладок\nconst useTabs = (executeStored, SERV_DATA_TYPE_CLOB) => {\n //Состояние для страницы договоров - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n NRN: null,\n dataLoaded: false,\n columnsDef: [],\n filters: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Состояние для страницы графиков - график\n const [chart, setChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n NRN: null,\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Размер страницы данных\n const DATA_GRID_PAGE_SIZE = 5;\n const agentContractsInit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n if (NRN && dataGrid.reload) {\n const data = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGENT_CONTRACTS_GET\",\n args: {\n NRN: NRN,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setDataGrid(pv => ({\n ...pv,\n NRN: NRN,\n filters: pv.filters,\n orders: pv.orders,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.pageNumber, dataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Загрузка данных графика с сервера\n const agentChartInit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n if (NRN && !chart.loaded) {\n const chart = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGENT_CHART\",\n args: {\n NAGENT: NRN\n },\n respArg: \"COUT\"\n });\n setChart(pv => ({\n ...pv,\n loaded: true,\n ...chart.XCHART\n }));\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chart.loaded, executeStored]);\n\n //При изменении необходимости перезагрузки контрактов или рег. номера контрагента\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n agentContractsInit(dataGrid.NRN);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dataGrid.reload, dataGrid.NRN]);\n\n //При изменении необходимости перезагрузки графика или рег. номера контрагента\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n agentChartInit(chart.NRN);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chart.loaded, chart.NRN]);\n return [dataGrid, setDataGrid, chart, setChart, agentContractsInit, agentChartInit];\n};\n\n//Очистка селектлиста\nconst clearSelectList = async function (nAgentBefore, executeStored) {\n await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.CHART_SELECTLIST_CLEAR\",\n args: {\n NAGENT: nAgentBefore\n }\n });\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/back.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/index.js": +/*!******************************************!*\ + !*** ./app/panels/prj_agn_info/index.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _prj_agn_info__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prj_agn_info */ \"./app/panels/prj_agn_info/prj_agn_info.js\");\n/*\r\n Парус 8 - Панели мониторинга - Информация по контрагенту (вебинар)\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Информация по контрагенту (вебинар)\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _prj_agn_info__WEBPACK_IMPORTED_MODULE_0__.PrjAgnInfo;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/index.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/prj_agn_info.js": +/*!*************************************************!*\ + !*** ./app/panels/prj_agn_info/prj_agn_info.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjAgnInfo: () => (/* binding */ PrjAgnInfo)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _tabs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tabs */ \"./app/panels/prj_agn_info/tabs.js\");\n/* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./back */ \"./app/panels/prj_agn_info/back.js\");\n/*\r\n Парус 8 - Панели мониторинга - Информация по контрагенту (вебинар)\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Интерфейсные элементы\n\n\n\n//Стили\nconst STYLES = {\n MAIN: {\n border: \"3px solid rgba(0, 0, 0,.5)\",\n minHeight: \"625px\",\n minWidth: \"1200px\"\n },\n // , justifyContent: \"space-around\"\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\",\n margin: \"0px 100px\",\n maxWidth: \"2000px\"\n },\n AGNLIST: {\n maxWidth: \"300px\",\n padding: \"16px 25px\"\n },\n AGNINFO: {\n borderLeft: \"3px solid rgba(0, 0, 0,.5)\"\n },\n FINDBUTTON: {\n marginTop: \"10px\"\n },\n TITLE: {\n paddingBottom: \"40px\"\n },\n LIST: {\n width: \"100%\",\n maxWidth: \"600px\",\n bgcolor: \"background.paper\"\n },\n LISTITEM: {\n textAlign: \"left\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjAgnInfo = () => {\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit,\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Собственное состояние - список контрагентов\n const [agents, agentsGet] = (0,_back__WEBPACK_IMPORTED_MODULE_4__.useAgnlist)(executeStored);\n\n //Собственное состояние - форма поиска контрагента\n const [agentsFind, setAgentsFind] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Собственное состояние - информация о контрагенте\n const [agentInfo, agentInfoGet] = (0,_back__WEBPACK_IMPORTED_MODULE_4__.useAgent)(executeStored);\n\n //При вводе значения в форме поиска\n const handleAgentsFindText = e => {\n //Устанавливаем фильтр контрагентов\n setAgentsFind(e.target.value);\n };\n\n //При нажатии кнопки поиска\n const handleAgentsFindBtn = () => {\n //Получаем список контрагентов\n agentsGet(agentsFind);\n };\n\n //При нажатии на контрагента\n const handleAgnetClick = id => {\n //Если есть информация о прошлом контрагенте\n if (agentInfo.NRN) {\n (0,_back__WEBPACK_IMPORTED_MODULE_4__.clearSelectList)(agentInfo.NRN, executeStored);\n }\n //Получаем информацию о контрагенте\n agentInfoGet(id);\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Получаем список контрагентов\n agentsGet(null, executeStored);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, \"\\u0418\\u043D\\u0444\\u043E\\u0440\\u043C\\u0430\\u0446\\u0438\\u044F \\u043E \\u043A\\u043E\\u043D\\u0442\\u0440\\u0430\\u0433\\u0435\\u043D\\u0442\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n container: true,\n spacing: 2,\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: true,\n xs: 4,\n style: STYLES.AGNLIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n name: \"mnemo\",\n label: \"\\u041C\\u043D\\u0435\\u043C\\u043E\\u043A\\u043E\\u0434\",\n value: agentsFind,\n variant: \"standard\",\n fullWidth: true,\n onChange: handleAgentsFindText\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n style: STYLES.FINDBUTTON,\n onClick: handleAgentsFindBtn,\n variant: \"contained\",\n fullWidth: true\n }, \"\\u0418\\u0441\\u043A\\u0430\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.LIST\n }, agents.map(a => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: a.NRN,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: () => handleAgnetClick(a.NRN)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: a.SAGNABBR\n })))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: true,\n container: true,\n xs: true,\n style: STYLES.AGNINFO\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_tabs__WEBPACK_IMPORTED_MODULE_3__.BasicTabs, {\n agentInfo: agentInfo,\n pOnlineShowUnit: pOnlineShowUnit,\n pOnlineShowDocument: pOnlineShowDocument,\n executeStored: executeStored,\n SERV_DATA_TYPE_CLOB: SERV_DATA_TYPE_CLOB\n }))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/prj_agn_info.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/tabs.js": +/*!*****************************************!*\ + !*** ./app/panels/prj_agn_info/tabs.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BasicTabs: () => (/* binding */ BasicTabs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Tabs/Tabs.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Tab/Tab.js\");\n/* harmony import */ var _TabsElements_agentInfo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TabsElements/agentInfo */ \"./app/panels/prj_agn_info/TabsElements/agentInfo.js\");\n/* harmony import */ var _TabsElements_agentContracts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TabsElements/agentContracts */ \"./app/panels/prj_agn_info/TabsElements/agentContracts.js\");\n/* harmony import */ var _TabsElements_agentChart__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TabsElements/agentChart */ \"./app/panels/prj_agn_info/TabsElements/agentChart.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ \"./app/panels/prj_agn_info/utils.js\");\n/* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./back */ \"./app/panels/prj_agn_info/back.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable react/prop-types */\n\n\n //Интерфейсные элементы\n\n\n\n\n\nfunction CustomTabPanel(props) {\n const {\n children,\n value,\n index,\n ...other\n } = props;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", _extends({\n role: \"tabpanel\",\n hidden: value !== index,\n id: `simple-tabpanel-${index}`,\n \"aria-labelledby\": `simple-tab-${index}`\n }, other), value === index && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: {\n p: 3\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, children)));\n}\nCustomTabPanel.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().node),\n index: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number).isRequired,\n value: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number).isRequired\n};\nfunction a11yProps(index) {\n return {\n id: `simple-tab-${index}`,\n \"aria-controls\": `simple-tabpanel-${index}`\n };\n}\nconst BasicTabs = ({\n agentInfo,\n pOnlineShowUnit,\n pOnlineShowDocument,\n executeStored,\n SERV_DATA_TYPE_CLOB\n}) => {\n //Собственное состояние - информация о контрактах и графике\n const [dataGrid, setDataGrid, chart, setChart] = (0,_back__WEBPACK_IMPORTED_MODULE_5__.useTabs)(executeStored, SERV_DATA_TYPE_CLOB);\n //Собствественное состояние - Текущая страница\n const [value, setValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n\n //При изменении страницы\n const handleChange = (event, newValue) => {\n setValue(newValue);\n };\n\n //Эффект на изменение контрагента\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setDataGrid(pv => ({\n ...pv,\n NRN: agentInfo.NRN,\n pageNumber: 1,\n reload: true\n }));\n setChart(pv => ({\n ...pv,\n NRN: agentInfo.NRN,\n loaded: false\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentInfo]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: {\n width: \"100%\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: {\n borderBottom: 1,\n borderColor: \"divider\",\n marginRight: \"24px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n value: value,\n onChange: handleChange,\n \"aria-label\": \"basic tabs example\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _extends({\n label: \"\\u041A\\u0430\\u0440\\u0442\\u043E\\u0447\\u043A\\u0430\"\n }, a11yProps(0))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _extends({\n label: \"\\u0414\\u043E\\u0433\\u043E\\u0432\\u043E\\u0440\\u044B\"\n }, a11yProps(1))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _extends({\n label: \"\\u041F\\u043B\\u0430\\u0442\\u0435\\u0436\\u0438\"\n }, a11yProps(2))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTabPanel, {\n value: value,\n index: 0\n }, agentInfo.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabsElements_agentInfo__WEBPACK_IMPORTED_MODULE_1__.AgentInfo, {\n agentInfo: agentInfo,\n pOnlineShowDocument: pOnlineShowDocument\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_utils__WEBPACK_IMPORTED_MODULE_4__.AgentNotSelected, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTabPanel, {\n value: value,\n index: 1\n }, agentInfo.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabsElements_agentContracts__WEBPACK_IMPORTED_MODULE_2__.AgentContracts, {\n dataGrid: dataGrid,\n setDataGrid: setDataGrid,\n pOnlineShowDocument: pOnlineShowDocument\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_utils__WEBPACK_IMPORTED_MODULE_4__.AgentNotSelected, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTabPanel, {\n value: value,\n index: 2\n }, agentInfo.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabsElements_agentChart__WEBPACK_IMPORTED_MODULE_3__.AgentChart, {\n chart: chart,\n pOnlineShowUnit: pOnlineShowUnit\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_utils__WEBPACK_IMPORTED_MODULE_4__.AgentNotSelected, null)));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/tabs.js?"); + +/***/ }), + +/***/ "./app/panels/prj_agn_info/utils.js": +/*!******************************************!*\ + !*** ./app/panels/prj_agn_info/utils.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentNotSelected: () => (/* binding */ AgentNotSelected)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nconst AgentNotSelected = () => {\n //Если контрагент не выбран - сообщаем */\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, \"\\u041A\\u043E\\u043D\\u0442\\u0440\\u0430\\u0433\\u0435\\u043D\\u0442 \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D.\");\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/utils.js?"); /***/ }), @@ -3396,39 +3638,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./app/panels/prj_graph/index.js": -/*!***************************************!*\ - !*** ./app/panels/prj_graph/index.js ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _prj_graph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prj_graph */ \"./app/panels/prj_graph/prj_graph.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель графиков проекта\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _prj_graph__WEBPACK_IMPORTED_MODULE_0__.PrjGraph;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/index.js?"); - -/***/ }), - -/***/ "./app/panels/prj_graph/layouts.js": -/*!*****************************************!*\ - !*** ./app/panels/prj_graph/layouts.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n\n//---------\n//Константы\n//---------\n\n//Шаблон имени ячейки месяца\nconst MONTH_COLUMN_REG_EXP = /[0-9]{4}_[0-9]{1,2}/;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Формирование значения для плашки этапа\nconst formatStageItemValue = (state, text) => {\n const [stateText, icon] = state == 0 ? [\"Зарегистрирован\", \"app_registration\"] : state == 1 ? [\"Открыт\", \"lock_open\"] : state == 2 ? [\"Закрыт\", \"lock_outline\"] : state == 3 ? [\"Согласован\", \"thumb_up_alt\"] : state == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: stateText\n }, icon), text);\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = ({\n group,\n pOnlineShowDocument\n}) => ({\n cellStyle: {\n padding: \"2px\"\n },\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"Projects\",\n document: group.name\n })\n }, group.caption)\n});\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef,\n pOnlineShowDocument\n}) => {\n if (MONTH_COLUMN_REG_EXP.test(columnDef.name)) {\n const dF = new Date(row.DFROM);\n const dT = new Date(row.DTO);\n const [year, month] = columnDef.name.split(\"_\");\n const mF = new Date(year, month - 1, 1);\n const mT = new Date(year, month, 0);\n let cellStyle = {};\n let cellProps = {};\n let data = null;\n if (dF <= mF && dT >= mT || dF >= mF && dF <= mT || dT >= mF && dT <= mT) {\n if (year == dF.getFullYear() && month == dF.getMonth() + 1) data = formatStageItemValue(row.NSTATE, row.SRESP);\n cellStyle = {\n backgroundColor: row.NSTATE == 0 ? \"lightyellow\" : row.NSTATE == 1 ? \"lightgreen\" : \"lightblue\",\n cursor: \"pointer\"\n };\n cellProps = {\n title: `${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(dF)} - ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(dT)}`,\n onClick: () => pOnlineShowDocument({\n unitCode: \"ProjectsStages\",\n document: row.NRN\n })\n };\n }\n return {\n cellStyle: {\n padding: \"2px\",\n maxWidth: \"30px\",\n overflow: \"visible\",\n fontSize: \"smaller\",\n whiteSpace: \"nowrap\",\n ...cellStyle\n },\n cellProps,\n data\n };\n }\n switch (columnDef.name) {\n case \"SJOB\":\n return {\n cellProps: {\n title: row[columnDef.name]\n },\n cellStyle: {\n padding: \"2px\",\n maxWidth: \"300px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\",\n fontSize: \"smaller\"\n }\n };\n }\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/layouts.js?"); - -/***/ }), - -/***/ "./app/panels/prj_graph/prj_graph.js": -/*!*******************************************!*\ - !*** ./app/panels/prj_graph/prj_graph.js ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjGraph: () => (/* binding */ PrjGraph)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_graph/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Панель мониторинга: Корневая панель графиков проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст приложения\n //Контекст взаимодействия с сервером\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Графики проектов\nconst PrjGraph = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: true\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.GRAPH\",\n args: {},\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.dataCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.groupCellRender)({\n ...prms,\n pOnlineShowDocument\n })\n })) : null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/prj_graph.js?"); - -/***/ }), - /***/ "./app/panels/prj_help/index.js": /*!**************************************!*\ !*** ./app/panels/prj_help/index.js ***! @@ -3491,7 +3700,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n console.log(data);\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), @@ -3524,7 +3733,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = () => ({\n cellStyle: {\n padding: \"2px\"\n }\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n groups: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n groups: pv.pageNumber == 1 ? [...(data.XGROUPS || [])] : [...pv.groups, ...(data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name)) || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); /***/ }), @@ -3612,7 +3821,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app */ \"./app/app.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../app.config */ \"./app.config.js\");\n/* harmony import */ var _core_client__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./core/client */ \"./app/core/client.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Корневой класс приложения (обёртка для контекста)\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст сообщений\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Приложение\n //Текстовые ресурсы и константы\n //Вспомогательные функции\n //Настройки приложения\n //Клиент для взаимодействия с сервером\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для контекста\nconst Root = () => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_messaging__WEBPACK_IMPORTED_MODULE_1__.MessagingContext, {\n titles: _app_text__WEBPACK_IMPORTED_MODULE_5__.TITLES,\n texts: _app_text__WEBPACK_IMPORTED_MODULE_5__.TEXTS,\n buttons: _app_text__WEBPACK_IMPORTED_MODULE_5__.BUTTONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_backend__WEBPACK_IMPORTED_MODULE_2__.BackEndContext, {\n client: _core_client__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_application__WEBPACK_IMPORTED_MODULE_3__.ApplicationContext, {\n errors: _app_text__WEBPACK_IMPORTED_MODULE_5__.ERRORS,\n displaySizeGetter: _core_utils__WEBPACK_IMPORTED_MODULE_6__.getDisplaySize,\n guidGenerator: _core_utils__WEBPACK_IMPORTED_MODULE_6__.genGUID,\n config: _app_config__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_app__WEBPACK_IMPORTED_MODULE_4__.App, null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Root);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/root.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app */ \"./app/app.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../app.config */ \"./app.config.js\");\n/* harmony import */ var _core_client__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./core/client */ \"./app/core/client.js\");\n/*\n Парус 8 - Панели мониторинга\n Корневой класс приложения (обёртка для контекста)\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст сообщений\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Приложение\n //Текстовые ресурсы и константы\n //Вспомогательные функции\n //Настройки приложения\n //Клиент для взаимодействия с сервером\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для контекста\nconst Root = () => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_messaging__WEBPACK_IMPORTED_MODULE_1__.MessagingContext, {\n titles: _app_text__WEBPACK_IMPORTED_MODULE_5__.TITLES,\n texts: _app_text__WEBPACK_IMPORTED_MODULE_5__.TEXTS,\n buttons: _app_text__WEBPACK_IMPORTED_MODULE_5__.BUTTONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_backend__WEBPACK_IMPORTED_MODULE_2__.BackEndContext, {\n client: _core_client__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_application__WEBPACK_IMPORTED_MODULE_3__.ApplicationContext, {\n errors: _app_text__WEBPACK_IMPORTED_MODULE_5__.ERRORS,\n displaySizeGetter: _core_utils__WEBPACK_IMPORTED_MODULE_6__.getDisplaySize,\n guidGenerator: _core_utils__WEBPACK_IMPORTED_MODULE_6__.genGUID,\n config: _app_config__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_app__WEBPACK_IMPORTED_MODULE_4__.App, null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Root);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/root.js?"); /***/ }), diff --git a/p8panels.config b/p8panels.config index b8b004e..294cd41 100644 --- a/p8panels.config +++ b/p8panels.config @@ -12,10 +12,16 @@ - + + + + + + + + preview="./img/eqs_prfrm.jpg"/> + Date: Mon, 5 Feb 2024 16:53:27 +0300 Subject: [PATCH 03/27] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mech_rec_cost_prod_plans copy.js | 318 ------------------ 1 file changed, 318 deletions(-) delete mode 100644 app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js 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 }; -- 2.34.1 From a9aadd0412a395a7d89638f7361dc845d364699a Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 8 Feb 2024 14:16:50 +0300 Subject: [PATCH 04/27] =?UTF-8?q?WEB=20APP:=20=D0=BA=D0=BE=D1=81=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=B8=D0=BA=D0=B0=20=D0=B2=20=D0=B1=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B5=20=D0=B4=D0=B8=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=BC=D1=8B=20=D0=93=D0=B0=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B5=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/frappe-gantt/frappe-gantt.js | 2 +- p8panels.config | 92 +++++++++++++++---------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/libs/frappe-gantt/frappe-gantt.js b/libs/frappe-gantt/frappe-gantt.js index da08f9f..68f7968 100644 --- a/libs/frappe-gantt/frappe-gantt.js +++ b/libs/frappe-gantt/frappe-gantt.js @@ -473,7 +473,7 @@ var Gantt = (function () { class: 'bar-progress', append_to: this.bar_group, }); - //ЦИТК + //ЦИТК if (this.task.bgProgressColor) this.$bar_progress.style.fill = this.task.bgProgressColor; //ЦИТК diff --git a/p8panels.config b/p8panels.config index c04e3e8..e7d4535 100644 --- a/p8panels.config +++ b/p8panels.config @@ -14,17 +14,17 @@ - - - - + + + + - - - + + + - - + - + + url="eqs_prfrm" + path="eqs_prfrm" + icon="build" + showInPanelsList="true" + preview="./img/eqs_prfrm.jpg"/> - + - +
-- 2.34.1 From afa14d8c8924fcf31aaac12b415331a5a44503f7 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 8 Feb 2024 14:18:41 +0300 Subject: [PATCH 05/27] =?UTF-8?q?WEB=20APP:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0"=20-=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=B3=D0=B0=D0=BB=D0=B5=D1=80=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- img/mech_rec_cost_prod_plans.jpg | Bin 0 -> 373561 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/mech_rec_cost_prod_plans.jpg diff --git a/img/mech_rec_cost_prod_plans.jpg b/img/mech_rec_cost_prod_plans.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fb163443672ad354a9145fbc1a2aac3affba83e GIT binary patch literal 373561 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

VM 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μ{8>02$7h zvly0LZLjj3SNB_HUIPXn{9wf&5Plj}?WDMeImPaF2)?a%T#(z2y2aUAWHHE4`^TRw zo9BvGygL!Zhqxzi1V!oJ$RioP5{^zV?6AWh-U%^1M+YEzVBz9Cid$5h(EXN65YGcw zvl`0<&W)0W)-8^;jMVMcRy@XenxL%@r$JU}r7 zMzbh>*4o^LDoT(~>eZvOB21FA!|Ki2qmyE?!9rgCd_*5?k~1sj>3{jUgmqJ^&){ENoM>by(%Q`-hXWuiPERomS1)E>+PcOCWe zNfM|T2jMu!9QquG;64N4s_Bis5b5?`NmZ6_2*xzyiYf6Q;16+&_;Sr#HY~)|lyk4t1wJH!i&I5|Z*>rQb}=XH z<=$6gce!%=DXBNh5OSdBRwo@pYXagfS@ePPu;NyJJC7U~32#A~>b_24Zcq%Ab<=I3 z60C_{I^8QM0omewUYg^Uc2&y#ITQZ?uMU2##p}hGvR;^w`mCtg`n7BF&!OHR=2unC zuJjOUYrPh{X&fcWg7w*rqRhmq5T9vIMLL^=x%7Vw%n!QN3e(6!h0AbpEN(p-4TZ>g z4>6q}*onTycq5M82(Ajq*A+zWNF4FWw*1_ayWhV93?yM;^T}Cw%14^9{8CBG=YtDE z}G)(D6%l%{ZoYfS^oeIY}d74A@;@i5silqbDZZt9-EZKT3qud1*Xq7bIqLdhdz^y zQG-J}JM0xfaI*1k^(!1bh^=C-vVRHSOGzh?tOJOeR1jKpUL=*}BIS*Q7q#_eoHn&2 z)ax&cR!ppd`GKfM=pqr&wnHIou#;(Z!02X=pxXG@>LCsW9 z+HU(2_;F~Vf>#s4*syK5l%h0B@$NKcye8dmNVzzDc+0EXZL&UJUX6%x57-#Z3)c?8 zmP#9i4ADD=$~yxX1rK`L*H+mhy=M`;@jXfW3rJHons-L?mAwmEYs0j}R%+w#lObq~ zN4ZaJ>(Iql!|dVsi(sfkWdS3O#Laa?gYC=v?Z1X8O~~b={AVqqJUqyFO$STd+k-X1 z<*8SSu9}#FvMf>T_Hx~q!H3oCRf?4p-^Yn9=WV5W>N8LF_mSfKckD$(P}wA&5bpRw zeGWE#l6Wi^JL|>i8#K-E12p{^w%DMaWLh`7gF!PyI^XUoi-pA_0;V?2SS9>m}o; zXTgb=ePHbvwB>(QTwQg7GK~>m?k z;GaoJSx;%o(=lGseN-P9oRNyQYo_~ddE+IJIA2iND}ft+b>F^G&TEU!u7%_zvq9WA z8NTW3Hx+!f!ClWs?*3c6{Z#4^?YqO$y-D)iu70icIQH76NucU+@3BLg#gZxz$1&z! zaFNC`hmC{|v9g{ZJ==3>FHKlT=vNnuN051 zcv2=?#X5Ghkr-MFmS97xU`X>%o9mKlt))WEVC(JHveG$#MLzRJD=S=}j53AJSAcVK ztB+$4mOd84tHUElDwKYh>Khs>ed){A*ITWzrk3hTC4?pgIl<3d9og%hOb?Tb;BCQX z305hPK9&csOTv&u57s%))SKHaXrQ;#7q)}NHlg;!!GvSsI8GCs;5ZM#_BQG$NG2+Y zyx9Eb7&p5Q6sL-WCie4tw0Jj{IsX7p2KwKM$Wkmj%M1RTd0%xj(umARGB&Z`qfHNn zQscGds?Zh1-LLc;KATVIzF3paP2U?bK89Id*2yK1zC`6v4o++wic@e-L-@`SkLai2 z7F)Rph3iQhwl}IN_%EXTMnaw>$e5mk7Xiq9XN+f^j&me^q(~-9A~=j{nPXWD3*s|& ziK*}bP|T}97ah&%-0^U+!`_+;wqmyudL$A{;VI|UcRLl2Q!2G`p9TCYn*qe&=Cke8 zl`QlC;uC&sBh zmaT_dkQNO#w`W~Ecv&pKHW#2m&rJ%=Y3)D};*`dhYoc}l(d8?YRQJ5-S{t>W?5y#! z?B`aiBx&0Dt<^16T4>Tm!Izw)PX>oW&2WMl0%IF2pq3&7;p0 zovcE*1E^`JJdI=xTc~^%Adr4NL;I+*#4}Z8?;IMn+G0sPk*{xi_Hq@oupd|M#T*lm z#`3bHXwLe+guN&eZ6#f7G$`rxXl12U1K#Q}DR+Q9w{J%y>Wu3V&axcT9ySr;`o=Tg zQbr$yKaUT>%r9E3Q@HynGO^==J~Odci5VX)>P{Rg&g2Y@O7a^bU)b$FXb^cAa^ML@ zQa$P~ZD`lvJ_G6xfWeV_zEN;b5v+h*iC1?QATXTr^dwq$Im?@11Dz zHvUqs8yUx^Z?Gpcn&i42oO6)sDkAU`FFkJm01mQ_G`fRzgwv_;Hd`wC>gUupMNc#T^mVRM5T3jNi5Fsj%zUT{ za#iMH270Hc$a!Jh0p?&pBZJH%mSjG{QSKLjjmvY!Xd*J)Y0m*Q$Hb(Jefu$!lb#lM zSYyVI{xWD7gW9>=JgF*>{C0RN8Z!b;YifDRh>Sk(PQ2NK;U1?tuchYP&X((0RGX!GQ^}7XXck%T z>)%}}gyh%XX-p3H=qT->Z6!_)ZZzq#hrT`*!z7T((MY8qrh1abg5N32*4AFDvZo!o zl8Ir!Gqhj>;ngGd2(V@P{Vkul7h-W{wzB$bX#tJZOA(;@ix_M`)hE^|?t_Iu|x5W6q*aks6 zR$(fT4^HejwRTxyGnzqSui=RozkdSS(p=ynma*=T;mJ>@!VK7R=A2}5G-UcKFKjRB zj>(7OGgO`TQ}RKB0mz6)S0j-7*%BknYT2vX3GND#LPJAZFx~xwmy84>jGY90k?bd~ zWbBeui#AU?aUE$qGCG#j)zF1eB=%;rA(D9-M{~lQPr$jeAAshbLM3I$`32PEUw~nO zi9Vd>*Vfzmag?H7)N$@>8JT!b0>x``A@J-ENMD%9hF%uR&sI+oD34@&K@8@2iANA= zHq{;8sw<~V>O%1ayHI3ZCs03s(+h*9wNL9V#Tyf*`e}XOYfjxYrEgTyK)FLxtJKbJ zBvCBeP1sHv2H^zuFBeHztR8L}iQv{=TW<35o$gLtRW%&iw9HN{)Acj(`Wl=vR$gd+kZBecO$A!bR# zHe8QePMW*c`@nmNJOQ1ZnmJ!Iql$I&WZY1bA@qrGd`1tfG7by2SK)Uwh#0?U1x?c3> znUGdWI;g3@A&7czwkk_isKl<1PS;pXF#DP2js+2;g>5fR%d>HA>#(m{q;SNsMHoct z7`r$1uqYhxJ|BqYo^p|FV`N7|(|WE+FwKk8dXJP73~rv*AK|jOKT9Ke*1eZBJ4)_c z)iR?gA7qbOF35yrt=!9zhVe-lvM>W8BbDbhso6xg933bJT^?{Vv}b6}%<%KV7|~+H zbHX?xKb|Bwqk)}b#b|P*gRhaAwRU%AFJ*fO=Z1o1bOWAR5*axR7*_mb<$qWs#UJ*c zq@A;Cw22H($ofkTu_u41xo^QjkT~%c#IQ-DyD5{gwgAxLXnd zk)J_W;mD)N!XI}9=S{v0zXS#2+Y2zZ>r&~1D-@T__}NlwcB;v-_} z=olTNV-wY)tM7H+Bdb^VrDn+D*QfewarRZ~sS$-txx4oYc*_?iorzL%Yc=ab-#nn3 z+xeM)V^T7lO7tR?lm_1Z_AI%_fI-bV8@rgq&RZ)$m->#vw+^F2SfAXC9XCw>0Hux7 zHAnhcU7jmaC$=*;j5~^M~CRDaN?&0eEtC8*|IZJ`j?U-?p>Bi3I^g&K{3Urn@MeQmLaSFm4t7KVKtct}a5 zXC9@I?^`yY`JPXc6>;yC4480mT4z) z^1C~O#yu(J>AI#U-SRE1h+#+}fQPXo$*qILYZM~enEx8YBbmc%jVphm>bmH||(Bf58950|s z>OMr~`)oLBl=D-nYmOdO`oWB{DsX`|Vviw_HB(czV&l}bNJ^*yehx!#=1S6ORQ5imS{;%JU<>&tF{j<{JI>UKQw<2A603jM?-?&yPwI;nnPiy$d*X zxBmdKv4)++KD8$p)vS+t^9(S~J>isRY=ho6!`<^%&QHu7=R3#dF`RMkGowJ5--9Yw zJ**3HiwR%jz=!&S0w3zG7~A@bo?D;eTojql0nn38hr1?uQ~b%ESpNVrXO?f~O!Ck9 zrdZcX>Ee~;c%Yt+ZH7avS1exUc)C;XHSwSNAojC+IMkULg}XyLH9z0ZG2zwldv;Qs zN(OpxKRxLzs+Q2yZe@n3D6CP6`BB_RR^c>JNvK)8LMGPnRMYHkUR4{7LhAquo4aN` z2bE+*I+%pBvXVw#fg!0QhmgL_{*~2K+^_Et;K!rm9}~mpEJFlq$6znme=O|I%n6)k zo<7QepLARcow?dGupUM%KzbaF0LMfsc~ElAc*r~`85|)cOtI+%m{eyOE=T-1u~2HZ zRXwGSO5vqP7!N22#ErWbHb3Vi$keYNoDPW?_nNY*g%QfZ;@Wqt5UjwK+y4NZ$Y+r~ zQH~AEuWC8;hi<3ZRmIsq^WoS(9*~`z@x|XLbAj*^iVh4Xk5Y0Pvraz9?ONJ+qm)W` znq-1O_?a@zm8BPpGs6ri*ZK!=o;>`^)mmtfyIkQ1U-Z|{X~rjAbldxG69-!K;r84` zgR8oD{{Z&ITpdlIfBx2`m9`qIh|dMOlPuS?@en4SiWnu-TYkt537Yi!hG-pw5zcJ9Re}YGDRh0XUOXB& zCE9;&Q0I@c{>rhzXJzxD4hvfk{Ak6wbbIQVuwA+H)y9Zm7Bmt?jo9Gu01UXrKCRjOm3RK-13L>b3p8smn9N zQnT5e!bPauQQP>Uo4XYrqbLv9gr5QM7#Qau;LW{8yGX*T-tcLzuO;F{$TSw(Zuc>y zQNoZyA%%NmRLvJ2MCSuI8OCv(XBozEoDYlVQF+N9!Gg0o3i~8PUo6Kw3+gyErNv9k z?0mE38ur~h5few6tzy+2`?`(?{haefUOxF;D$CSRFQjlv`LU-@WwCqKs-&{Ud?oFO zENkdVIDQ32Sl|U5ag+1tMs)YC&IbA6#m(>i8s>GME2Y-3_puCip=jn_<+)N_eBoH~ zoBcCWcG+u}gx23%2nhGyY13;FmM#+0qr)RdA{2g<>We)&ca-K@y36%;l%u;&Q7j#O zy4dL8r8O0)F;CJa^!rfOVt$bJe$#1cnDq6q7f2* z(tolZn5UoqGrvBVt)Kof;6AU@DWCo_>U{cjv;P3bEgn=hihN(vR;%ZzyfA)}w7)%e z&m#RJXrJBLO@blqw{%LQ~6BUU{MYz7s?G2RWhr7S1UD z08R6ack)SvHU9vVgEd<Y7>IB;`WLqTU-3AwTG zr~O*#GyeeE*g8|CkGAhWQ@U&AzR%RX2g`k*sQO=)_-E=SujRd5gQTiPffI0qeyha3 z+eq+q()_kDWV#285-f(nrvNCDuE)IURTRIM*(NFbM-Yr-z&SH|9H$qLv4$R4X2(oo zrtjmvCri&Vc#+(%#jcsNS$US#Rm+gUO_R;tjv*J(wxog@7VJFMbeE-x(lkfNI&W;O z!K#iELAMDPH4Y6X%nm%9nA*#M6pGRuzo6V3ZdX}tm8e|o98;f|>s&_hp`$Vwp`IiR zD$e!xP)?QOMU9wdrTA_xZZrE(~4ydJT)p?&| zEE|2J#`mn6k<+7Ako}qvtOvj@EO-E1EC9%BO+TuyYS*I_WF9<6NDsUEWU|9nBJw&! zo4&fORG26so_(IfW3-UVddF(>zzf)<6o{!NH6%wF2kv7SV~n0e5$AxP(M%QM_Ug*Ts?omtqrjcI?u$Rv<`C5kzaq^KQlQ-`g7d2A77kVntHsz zhDhjCX6MUA&a7*1c+#XWm7eYPl*bwJ>wkZt9@HSqn!0rzWrl(}!9KF$T}ZXUN1lZs$F>B<*VF!r;Mdjn5UCAEqfmO;yOwnw zEp7sorn2*NBm%C=RK&&iT%#9-x3r*VXA;Ih8Q5?kAcLKpuLnO#Tg$LnwWBEstEP)r zaukM0!LW7ue=yaGaVbum680I7b*g%JAF^3YWol{U3{uA-wUuJ7_F!gXv>@46$kBcH z7{p_N#wZ-;0P}=l11QeIywRBvR;*Ah$BpM5rHdX($)|Yr@l+fI1&kFTPez6~=S!!3*>k94G3uP~4r}=lf~SMKQLv+1a-WQ1f!Ght5nJSNR|n*9R$t|8 zYOC@XD#m|2@^PQ$!%9ERvEfh&0f?RzDyN)S$6&>XdXDU-$y(HNGq(`TuArlLg)i^g z*knG~=O&QH-pcHa67463DVo)>>^JnW0{{ZK4&VI6QzqkiKS+}1zOdVCb{NTaWo00q#@O5_J zd!=)StoDQ63fak%1V))Ab7br&GNhI-6M^i zrm3*m&enD_`DLk63Twq^Ry^YXz%e7hp>Uou8q?3}i^A8T6hsmXu9eC4bH+QvS|aYt z8gBaLr9xn&rg`=|U5?UcYty`7P9t8(5m8H$c_)*}&I!&2cHzQvQ_^8@+Xb?9+Nr>=T-jD-E12QKpW>w%u2aoK~P z%Q-p8z;ZVL{h&w<{{T1+1A`ZzpB%RU{gOzUMU5HV)kgQL_~s2}EEcUsU4s^a2ZCYW z#zy?agka?7R(kJxbyM+->VBmWyKCsbFRi53*b)eedE%o79)mQRnRe4H+l$3TP(B+U zS{8Gp{d5&@5Pbmz^?3Vrb8+^xlIKPMyIq*gl>S>=Zhw=&Yv}aRAAUZl_%OsD5Hmyj ziGH^k#&Miy8OCvrpyyz~qXLXo0|pEq_9HHToS)&&bDi1Uo!DQ~CvJOjz>&h{jdy0Zd&8(3USlT%hGVCb52lpl&?wVbEjk4D-5$o?q zaxPQRx7t+M#pA=mT7tB)-Hw?;vh`~TdY@?uduy%3GuW>XBOpI$W$n%FHvZhSEHp-+ z=|Xk%yFwXqf6|o7NvW=ZGjrBkjn64Ol1HmCiLLFn z7hy2jw(`dWjU0R_&Xv56JleY_?j~2QJdn!_LD|r-PC!0s{YQx|dD%a!HVe(qJ|x*5 z-gv)tW_2G;S?B!J#|G-aKjviP>6y9poycv~p%jp%r&z0%p0Yj|{j-is<4n>Svs({Y>+ff2p2sxAidEfd2p(#+nvV1A~#X!z#-c;?niJ^*D;ps%ZCB zcW^wl`BTnyJq@fyu2I%zPg>9$ zC}Fo=?w3u!)&h}2V&Cd*>i2L9N%wUaOV#r@_TT#2Y=n_1^yetZsMdM+=p=fZX-vOi z3M7L!ZDOS(Bn4HdZrakY@nYwvVt6)_vw@v63{w3hWkBPkj~ge>SONhf;l>3g7CZn9 zgWs-JjC3bhF0ILtDuBtgB z+w8nqd`8|zuTc}8Wu>5z{_^X1DcAaKMEc3Bz+6oo$)S)*9EDhKc0b)59YwSLy5e<4 z(S4+g7ppd(oEd*@cKqULWbG?%=gQQ$x9{`9+n<>2?i#$4rK!wGx!L@$&4+ck=Y_pF z!N1#&YtmrqJAls7wB>6u#D<+oc@K;po~+-(^>CXXZEY{@FdE@$c;m2h2zB{#cU zdr6s6!%JGN1VQ3X%ah!0(y)>RM;tQxF{*j55jYzux6^%Q_S4p{R&`3j->#tl0DYy` zOR=B7)nGD3PPz6}qpP*NzFc$RM7|tqob!O^Id|5a`KaXda|C8n(bdwIRN00;LiK>< zD;(Ro9Xm7UM87**`PHPaO_k~zia$NvD0C;e8YAAmT3Hs3lVMHhSncGPciLGslAWHlc#B!Fj@(_#=-Rz4ZJ$$XZE@QrC;CsQd~a|R z2P7{UT~8xAm1l=}c_)m<KSz;I7e`P@;V~Kc9OaTvIdB1%0v}_O4hbOR6YI_f zVS--~BUunJ(0X+XWPbR4(=M-PQ1gA`z9`)kd|qC3B%LS zejhbw!Lg)*SykhjTIR-?5(hKwClS1@5m8$0rjKbN$rN3KoQ-z!=dl#Olb^<|x*c-lz4V@Dx#S{W_E9ENW25a!eV zn`;=6kfe@zRCXNkkcpYcfUeSS==jjr+ms+r!$~8S^ov|(^^N|-+9H+~C7+QNgvh8x zkTP8xrJ(?v9E(QsIv|}!OQn)Gk$hx129jx~XjWte_0phnT?T7eLL6llH|)1*0o{hxg@i> zX?2V|fGj{8iwQ2lq=ESg%&pw4RkZrs7Nd#51`9S-_j6dR$|ByoJTUhUt;ziJUO!_} zaz*6jEuEb`*lgBvr$xH0yr?IDg^(QI^!I{Z?F9QBz~Yc)kmmz7YCL{Nwu^gbLvNJ( z%HR5LQR?{|PX*ltoeum@DKgaENJYaUH>@(ra&m$w{6vCinZu(YudtcnO7lCk9UHoy z{aGTg{qrn~AS&6v>E8ps{!@K2|JQG;k)mCl#++k67zrT_+aWEJMI>Wjj` zLKuiG_pXq$elM~Qg#s5PQFk3h9;f6L}as8ud9gp zq%vF3dg`Y9JWPb&eErmm|v6$ek}MK6D!cva_8{_lvBn zoki;$2jB*A@Z;gfz_Z(C!s_B|p} zo7Ay4J&;VZ#T4=KQmFJ9yXoyt=>XYLNsnFWbovdHRj7HVI+$o%+gF0&mKxd)hw0sM zN#dex%Ea;OmS2pp!!9uO%Rc8BdB=?8YEDHTA8oxCP3hEWk^U@`*c{w_jm&M1If=$a z>k^-j=|;DY(i8r5Uq0FTg-~r5OzSDcGbk*>)GN5BHN~)@QQo6w|xo!6bg_ za^y^v70C3B#~I(<$N-#lVeE~BKk^(>Jwf;k)7=y=M>$n1vhLkzCyFGLOI9SOJ(`f# ze-gvHSK>ay9>&0^>mRE=o+rC~9s}N8#%*7neVpUFG`B6qT~azR*j?q9w`4oiineR5 z&qnlCs*)w&qPd4-QP|a!)?=E5=D5j$H)1(ReZ(gxU)wvfqqm=eKF>>Ihqap3{k}t+ zLBv+Fhav6NzhTwq}JB2sIXy+?do=ZhLN>o z*1zQ|L@L)tl-`g-46iH(2D7k|SVRf-A*%9|o#(a$`+k|! zKZX(Y>L(ibeir`ICTeyzbr%xFXDZrVy?wo37CsVS!#bCzz3)&=hw;8Iu51(WoE&(I z&T8&k)KBKA`mG&}E!`$$0oSW~dFV6RfEKF)^3HRnr$ZIvZ?!(cH&dnln!m@RoEWG$2j3%(HgU@OPf@4fC|HzgT%J5t z#?;EFdtF%4rsup!L_!Tc32ArFc%YuTq^z;buA(OV#z(Th0(M0)0?C?bjFP*``T@qO zVsco4*Ru@PqP<0KIm?>)ZB;%LO^HszYvmH5SySbZJd>VgnV&m2rXQ8al)4ZwL;1F9 zdP-)2XTKA|l63Q>&k0}dRM*y33OGdGTCr--4-=|Ga`OKGxVE_-#_0b5duU>9?|*-2 zWP6MM0QoCeo4tqrPR>KP*gGnngzU987a-=US#^eIxffH`@=jJ>qq?*z#4q2Hdo%9# z7U~Mq*ajYhF1u;Ry6n%5)S75MTi^^Z;rgQoZZ{(k@;)Tyfscte#pK}ngX^EFzxHdE z{{YQTkB)Gks6fOVwnVAW<%& z$Yrl=&h^f=V=R=d0qd!g=vCl|2r+&LycUH+s{wnXSJa$d3r|ouvqLeHXu; zvUo?NYN5HZ41lC)JpdeKR3kT^q!?hC>rsclI zSi5T9i(tgaW`}}2RLb*5;HdEvJV^flsF~iM&bifnUen!tgO<V z)#;w>bIVP|fvCMbU5Z8$Slg>=Pjgw#bL#!b{Q{Q{y!3C-76>vf7iaWtDv=Fe&CGn%mdn8$p6;&AEQBVxcixOd=T z&JV#xZqTcwvHBQbw|;bj6qb2~>Q z3USL%9TQ?TOaiM}FD{=^@SrVLb z1)0^$2$YWY=hr%OM+6-zZdxzjS6N=pu+GeD#S2xh6j8#W7}KbA*EQDGsC1J@w$*_S zvT|B(qNiH6wqF7SjcKr1J#$@B<&nj2Lt={S;DTgxF^89LMeWTd?#Glg=jOm^yaX=% zv+A_=cGLK>`YkGOQh-AW0KJR(E)dty||_9P)L4wudIAP{jWLvqR33 z8mCQV<%Jqul+#q+(v|_tx?YorlXr50&7H1`P@3y9r3e-JFa_StkT9F8?mx?U{$4MD zInNo+0(r*7IOCCv@CPm0hO7@f?h-zp5lKNOLFzuBAK-DEXKr@qZUM*rpLc5ja>D~= ze3u&t&M=HT=e9=ROsR-?lxI$!cE~fIhVSidxXnkc-IHX+;x*MFX^jcwvsgI7R=Q;HL z+vj>r`hRQv^XJmnzH=$hrS5)kocdPJ%_?h++@8aRtl*%i#p4v z-N_)~%x;kEDzORUAZaetbng?PUZ-_kZ2lh(&vBL(uV0wr_<&gO0VhqY@OYL*=0JnZ z%^|`#8Nd8-eR@ZVF%N<`S%*C3gUrVwPWth%%}u%JO&yxfQcWh}w%)IZoFu{5I*UTH z7r8}vl11)IBNz9BAoSp8;$Ar;DQqXFa7`4=6umdpkZx1KmK&9x(JyoARL}aA(=i zlv1v)4+mFOD(C#4Q}9H2Te37R$*p+4)ckV_GblwLW)=Sc)@`rI@)wda%b&H80yg_W zp3RDcI>?}^p2boC&c6I~@(C0#1sSqEfQ)hBwkFO4_?4F<+Ei2P&O^1P=e2psw$&ki z2qzbJNFP-=`$|%`F{vh4T?cco0Y~w1>EDpFYic)^KNdUvUj$TA1gMU)^_67Ts!OV! z5~jv|^wL1>TB23e!>*}3lkDji*Yxy|ZBlt}Q890Jx<-W4d8D#+YhHVC$3Nk@u@%r& zht$%yBFf$b-ia8I`{YGthG&W)8U$6Tv9(ubdHQ>kXGZh6wnpv6`v5Ry0m3Oy8^;>6z4%FBy0> znlr+_`t7A{9hq&|SsGrGmF-rwwRG%l)AL1mMlkJ7n*4T zN2k|K)fUCONYU$IjbcEE0%8*%RYCzO_&2qb?u8!+#$=+-G8_S3FK zpt&SsK@)&97rl9gOgbAsIBj9n&Ytw|r?L*akH7|1d>S=cHmW6*HDew+yY_6}Sp*DW#i%O$b-IAbT*BKrrN?-JK| zQJOc^xf>mEbIT7yhwz-C3{!QZ$2ug5EP6giWleLdMW|34=*?kYC#WDW)zB%`^!1Qy zBASE{A^M~I4t}WkKknNoH*`k3W1ObaoW&HY+b^)>O@f&84`US?r1*s9b~gNf}yuFET1kDKU@PgB*O{ z{y4t9Z%T0d2dtSl@6K!eYe$hM5vj^{r=?{ltmP!r?V;P&@gm`6<@0%>@ypt(oJy)z zU=OB3eMT-Z`$sBUcwGo~M(Mt$`bUa)3Z>4e>7#ZjXP^R2s?|$nBvUt+bJEwi^s^IT z)$O&XyhdL(yW6r;^3u6E0#~_0+_Lt?JuZAT_yT`3ft%#bf=3_5+2hOoSHWU&{hgzwFmwi8)Y^m;79ipeW-x19?6lT(mt-5BmPdWmys_)#O0pdrvs+JSuKFmaQIQ zi|^;y>}>3%@hm?$kJ*8v_ijlNL;nCd6p()xIMY=lgWa6f=j;+NEnePCfRj1^L}*m; z@jk7MJN6JxJ@=j!Y2Dds+o}jKMiEQ@Co4_KnXZWI25Cl*);^{oymuHWq;IFVOA^dZH9 zul7-3txx+D!B&y?qL{R3pY|#;&bE)1m_<+{`CkirtnvL<%_kg^LcY{|AdEThVd>gG zA(OgBjKNgrjHC0;vDlQTl@YyWl#J;h-ZR=K(I3;_E!TqWX)9SlEImjZJ@+ZZJud`X zePUUb$sp+!34AQT`{j90a5+_gw@N{bICG2ab6M%vXCyT} zOKdGB32BsKHdAo2Q)q;1v3Ab02sDrsn9M)I<2cSUjN>@YF(YPPK=@XzEtX*l7BYVA z^Hx7+IopHk4B9*>2Z~r_86#C7u~{#O-X9$JhC}tLe&k^MIiRCi;%oaCDMseq?OXAq zWPt7NTZ-a0m~ilJC60h|W*KE}rJMUy#F*WnBtD02tbJVT6S}{^WD1GH%k5SLp2{IX z#dx6>*rFJP^c*MWGY4mYC_h|A-CA&hyIvs8JgGPni>8Nm()YOPI4qp@Ae zNvGPuwyoZPB;J|TJusJ9uhCvC$I8DA$RYmhoId{m3ib?RwYlx-4y#N2P}si{?z(wx zKbxz>R;g`X8-j%KvdU!#(C1!Ao;_%k0Cc)nyR0(@C~5)N1`Hn`Y&U9%1&=Wgg!IA$2B81*7yiDIa3-!a1}QS09(D=+mV!!oG- z(Es7H$2*!z2pOMHlXFWLzScI+Cs6;({L>nOYrCCiK@y(5=Bs&dkWfCcoxaZkgX zARKYZsiMPlp!02n8o6ag0_&B_lZ2FWZImMVp|hUW+#c{Eb=5v`1R4OA~>QQsT<<9ZWSh;%p~T9htbI44+@qW1kJ}i!wm9% zVmeS@c&`$D{ zE`rwR$LecaT#si+do8RRia-7z4)a>RjPs0r*09PS&dLYVx?}k7agVmpH=)|7$FtMY z{{Z&7W2aBQw&E;$ItTXM!ZEbE7xvvpkJ9>SeYa_k(YnU=-Xly1ojs0UTfim@*Md3W@@oW<1&#j78) zpRcrw#q9KBh6YeUj!xn&1VZT{R#ksq)>l+k1Oh`UsRRc5K~%4!diJX?D*Tj-#QZIg za;OGUf?IRPUJ=XeEk_}arC(aF9FkArMy1qQNA#G)r%(dmGM9_;r-)gt-oY^ zu72q;*OCrZ{mSJ#b5flrfy%z4X%^a`o-kE`&ZW>T-fmO@Y__Lpus<{>!_!;A>-1Hu zi==vrZ&>uV9}i0J!xj1-=Q`e*-88PJQ*%0M-rfSVHq>oq&qrSTiDbsUW_aa>QyZyP z>N{R*Z8HPP>7equy6_)*--HjSJ_)VA_SBr4>>rM-iQ@a8 zn5vWi00LOn3RAcl6>j`mYx5Xt#r&Y>l~2nBMf`>>5Pye0k6aWJK97$EtRH2;sKcnk zs$udu^jrS`DbJ&xKegN6j`e(>g0v@Dbe%hIa>XN3u)d1Emt`CR+)_;j?`radlXPQS zT{~xWRTVfvYoIpu3UOFj5_HYFfC;s>RE+|F3)XbQuGduu$C@~>O{!l=mdw~Tnuw$c zI@*Ay$4WgTvpl99%{Ye%TWIJ4Yg+;}(I&zbjVE6(482h863eqCJ#bco9v zhLT1_XnL0Bwsd+kcx}@iLtCh*d6<60zf!|-UR-R2WU+E8kwonEE5lZ_a3?%?NiP84 z^v5I*`H_P^{1TuN+yT9~Z``v#@abR^T#~^YimCR-N9wq~*=&Qhaq@8-NDr!BG!`YZ% zl0oew;GS{qG`K9;`B<9;%VXNq`RDHc0C_%n`@h~#o__E5ljqVmes<;0q%MDQ`SgXq z>#@Uj!+W}%7Ns93u-Rkp6bB57-t}r64H*9bWk(Nyedtlc6*l#4Z4-hDU--H>>r8+4 zWjxyP^o@`eRd^Y~{#nA{AN=S40G+e`JDWK_%-PF-J7+EZN5EV9jhw&rTRDH~Hg`Yu z4tGEG4tL4@Oz)TagFH!ps58Wu`PV#Yf0=W|m-AeT#Hhu-!OA<0-p15a>pM#<{WsM! z%qE^HbGuRN2K;n2kDW)a>M6BSz3McQEpP4*#Z-~WD525NfXm0nS+qLMng=W(H_?4s z8{hV;7QAn#~W&I=K$JQw-vGQYDssMykt~mK7{|b5P&twoB65;p-Aim^yZ#m@K|# zIL?9}&c+=Df1Ayc^!;~U46@}Wy+)!|gJ)$Uj^5j!UBu@F&7b~KT$29PqImw2ek0gz zpn(xKWa4f*gvuAs!UvS=FO|x<+16|Aas!vOeN{c9WYyMA^Yj-`ysrLM3_Sja}U8VmQ(6pO-+hf2|{>o+!K+R*AzDzp=ai&=AP6_HzMT0#l}2r3BLRIyX< zVU|w>&p&#f8Ts=TKd&Z9VseL>_5O5eL)#Ug<1&7Rv{Ade>3rKz;YkP!wzZ`{;-DmPjzD|u%Vs)j9E4l zTA9m>Q7T{8s6ZDUM2!o(1zS70ZS2tMVe!lwS!bWj-<7ADI?=>9Ma}9Drr!}c&DRlW z?3`b*{{R?Rob|+w-`f(m9{#w&QwVoHi-}p!z9a!~A;f`Ed*#WdMI<8Ouzw}U=OMW< zqhn4_A!8V!LziUkZAVvH)YDq9Q>;>5^@(SicY?b)+s()#7zS7C%k@wNty?;Cu2XBw zGt_veeyO1MC7~=gA)l;w)7`3xSXo4`7Q$6BRjWT5*)LzRkUUdf5o@Q3I8KdB)osp~ zZE(**cw&M?vjR^G_eZp-Eg!Z?!K}Leo{1jhSb{>0ojpZox|7+RVUJZMHy)5et-k5) zMQYP*psbNe8fmQhzOJdtdYvPvXeiYMVMy17P`DGg{{Y8m_5&FMWYr^dA-T`hZE>DS zdmJ-#jUrj`s%c{Op|P*F+m9{JiE-F~6>_|c z7l9uqxya+g#OLQ07WMt!cm8o>NI#{J*Yg&O_Vx{eH|p(T-i$J7qJk!tX%;x`UV^k; z&onB~?5lRfmMm6^#9O*j>?WqNpeb&&v6&;W3!>PCu3_;E!-|I0U%>jW0)OF6pURvje>SOQx%*mb`TuUkBl3 z3B6SOty)^rD3aHN4drwtHc@3+yjegNVwW~2osFaL=Q%ma&VC-Bkj@wK8NmF9!;|@u zo-2>zd=@4i)5k1@`bzKjPoGI${^hW3F8=^qK9;-l zkuyQPx;2n@_-x-!TKS||^yQD7QD@VWe?mO^a!;Lf!Mtznmj?IqtT1mE=T`>uKkeHF z@*n6v4ctG{mlt^l@=b?%TjsN4ZYn?ZMh(4x>o$EaTl%;*)&BslxHfg0{lr=Hg=SV$ zVh%6I40cC==*f@xaQq|Spd&iX%20_$bgUrDH0_LpWIy8{!g3?T&7P;w0&`RudWs;= zz_q=pu87vwppz6%9p*(0Ecc}P^CO0Rj`FQ8VqRylb?oe1HQ9JgOBlCxVP8b_E!%|t zXEzDX-`j>%<2T4#U*V5`qxkhXYehsRM1ZN`5JgI-&^v zgf!qn#w{JWr6|?gHacdk-Ww-l)76_3s=uOimr6r(aSqKs!~^2ZmhbE8@R#f)BXet} zBG*p!rHQA5s3`tc0@k@&(sw~Ta*StG9J2w2PI(LPe|+sy&lz7x6Dy#|fCDc;mMXMP zyso!VQiY==71A>3rz21^(-+`ZJ2Ioi*>)mFh&N4oofrf125(_&I%}{fC9PJwdsg$ea(uFAlgIpj@<^j28NE_7_@sTHmFnqscYcZYD_b#O`2W2 z6zil=3eelt{U5I1HMwsIBI(3;7q7Y$UVp%UW1U94Yy*FQ+=e)%x%WQ}6>9S6(b_d< zoU9ilK#RbE?M~(>M>_2+c4UP-L|3B~0kMcpQYm5E(KNPJYV+yX-=1(r5{&|Zz>%Su zV)2SMgIQKso<7mybjA8w-K|S=#U_5dX%F{U-F2b%V{6&a=*+nP8(@YEIe|z zrN)O90q2dJgw^2)@0?4PI$CKgO5$O|^rY+UCLWZt{Xw6qcL*d%nfj}H8>a6svSW1S z#12*x*#?g7g)JO-dUs|047o@YFb|3N z3}f{N#n0ZT_&>HEgh;6vRrc#|^0l)`35#DFeD7>UDs1h?i5Ju#0q`GK`y4=gLf<9y zQ3H3Qt_HSuocQ-s@ z#uxrh`FPsJfpch}#~w#qx!^8AK@-)0EL1KSOZ%Te02$!}f*>-)>l=0e36adGSMY(Z zt2d)GqXv?v$)v-jtQVg5%RM^WD5}Wu zt0kCD>so44@hiD`HQEB;&tbS53y>l5)RVobOFq8XnF#Szv}LAJL&8>6^~a2eiOL{& zWE_vVXAYi*j`w2#;Lc`EuUI^k{3sz1OBT$-KY06D7R@Gz$g#P`*p3=kWI-m_Kk@4$*6M=nk zR|4Qs@ZeEq1t{AG|s8%X5wUeef8+1|O!erMn{mAwA|pJ5}1#0 z&mOaW^|Ai|cG(B3rgY^>x2jGizLcLsO*d1|5W5WwwYQR}CbS*xYj7Y#C1^XI#^E4| zr-A^|?q^GAv!Zq#IOlIwa!YctV6aFrXRv($v`X9skxVj-J5&sKiH<`lk~MW)?>@h0 zoEtblmGJFq{L)MtYAfy}$+p#Fh0G=SiuS!BL`PsBV@LYLXHr|OW)+4f?`|T0MRW~i zLi3S&V1*<`8~|Q69qfRG0bV}Sos6f{eOTAM)p8}^05N~SI0h4({6-8v34ea07a!Z= zKLF0QKXX?O!oI&-U0dzTX3YBwAf8#HKDa&u2l!tjkpO4pk6v;wP5!Lq{roUFtw{x` z;MP6ag`Kp`JiE0-sS+b_LILosyzl6KNHdJzpZ#J1h@|DnL!xAAh`cBR3;zHpzzzU# zCpZ%?TJVR5AFG#C1jyWG%Jr3vL{S*xBGg1JiA-#>yPi#vhFM7DOTh6b1H4c6Zzr2* znoBW;Y7tEXi7cx#>rJFsUfQ}xMo7vSZC65;JUDyyHWB06?dRFIg8=ZWz>5$(dy(BR zSQqTd;0f1l_Fk+9Y z1`qp=x!oGjjbshPt0Jy={Q3;>vU$K#A1F-6aTQ+?kYDH^m5b23Gg{SjcEZwk-;h(y zZiiW|5SS{Vm*Lm`o5-_SrJB`6o3Xf$QDTpL!_iW2KXO}5>b;AdqdP`4d3Wy6C(a7M zARPMbiHHTwZq7;)l0MXQtiy4kngAXL|A^Q!LzZ6+tW8py*YE@2!BHg`+ zh1e;JT|)H1^05YMT}9=QrK<>MwbUyFZ9EVwOTV_4f>=cCIzpp&P`d?RH&vVb{Va*2 zu)~Y>LWosCDR#LFm39$D6l&2qXf9TXiA0wH&f$cNZXQrRT>P?L04FX?sW2?8!KbMt ze6lc-*I`lGLC6Pi;}jLgh)d5Lf|cL1l>p?thV5@ptE^8GVFKhs{4ZgI{YB1moaZ0b zd|Ypq94FA{vJC5Q!B-$dJn0)q7bt3LQjhLOd&P@`;y$SQu%Es-a(YX8cp_&gX=|#` zkFpf?jv%T?10`2#qEe060X~BQfslXJbm7io6d@fByh>K;LNd?+$CDd8IL+9N^E9lHi-2GlxMVH-BNPGkK*9e2aeCZT zY0YkL!Fuer?8|C)=3eq}uu=ds z`(z3pg;$<2>{x{uK|3OV-YXAwiZHjE=aPQ;@kcyym+1M;)mS5q5jPzzeuplL<{`a7 zsalo>aM|KHNTO~E)REv;nkN1~&kfPfDX%TT@zVTG4K8pOo|Sc@f29YC!yD?^prKzvl4fl>tY1oAP@E>G3zYv}77~e00{u7_VGkru~tYY?gBY31S$faJY zUn$K(>=WgK{ABd9!#U3G-L|xxB%DG=qKw}THTXXv@E_;s9N2H5ti}q8Em>%#wLh7? zDV|_H5svP8Q-Lrpc4ua6EsCgBJ!OhFu_q)KHEIadg59~Y+4w(V6bj91XvB-=q%UW8 zwSxPi>}-VT-G%A)P{lpDq(!X1GT17i`8IhNx#Wh_a@)$-d2!K6#X@_ zW(3({W|mpyY36dzAE_k!7U428-7w_hkQdZoU~v=(+bW*b&0{NDiCK!9P_&dxE_>GH z6H@%hU5iYCN53R^acji##CV=ao=#)$nDLGh&fs{ zAg>@;qY5mig<@F#AEPf`tb+i+Fbo3#`l>(fy8i%c%ciO$={&r?c%UwL;n%zsr zCYH>wiA_~hB_xQp&a;W+S&)M?CKmkE9MErP(b@5n?Zc|QTV+u#)R0LMo^gE#$BYB& z?qmZ~w|waE9?r=8Z7MVlB!0;CFAK)T3u457Q=jn8Z_~bn_&&MLoMjq_$7eZNi%2<6 za$@8H51?fhOEDP%4RS@vKYaLy)Erx!`CD$RWv$eZkP>b{>e(pGbp$9&$QPL7?N!PK zB%GNURctacKLHmtz;TfKNssu>SUf=aNg7$!vwwyHUUv2p8dT^=HeR#m)2R9YtC zbz3iA*rYl1Ez(E+oj*HTH*3}LC#N(?SNze#nqCA=gSP=3U?T^%4?~=eaNtqKetCD3 zhG{CS-Gqa*9h#aWKV)M-#RznaDdGb6^J-o^yJj>ZJHtu@z+RmADTS z`y!@5V1fuEf-sS&RmOEiEW{|R5_A%)cPfnS9~<{YW$a&Bd1>SzF>_9!kL&`W_8Y{3 zKEP9tzVExslIugJ<+a4mWmXOLg0x*Tekzdg{Wa^frf?>4#&u6v_yy@|*coIj?9ww9 zV4RXpMGj2d`VKgc)DSV)ucm4`dhOsWeTX1llv2LCII^EbLo<^u)9%xvbzFMvtm5=$ zx7jvUb77(KK+PT0lxlA!y2uN1dfI`jdOHApiB!npP;%EMXPd+BY^<0@Y7OOvh zW}d7RW|zSY&p!*nT9oSjy}c&Uxu4R>m;7FS1m@K{>CCu4!0CvfeN-i)joE0`k`@gT zL?H<9qWGNUnbr#nmW#_fLd}lsW9VyO+WRhpS7$i?|(%leTll zGPHLnJCL||1dLz!&C(O6wU2nn#yV;xXetFhB+S!FJ{x`2JxpBA{Ja)+JwtLQo9?Sr zfLE@NspJ3#5-0rasbk&hVUe6iablaN1amH9aNgM^IK+;z8I z1g=`r7-o_)kT6ln9OkN<>~@u^!|2uG?LDef8WZl_nc+970dvEX`4c=jeoDAvoml;m zowI)?DogyF8TPmAsNphT>@$vBE;sycmI@&D7nw$je=u?MXJdss}9DFwo zU1&(wN~-j{sPVF|jotC*{2qR#vD}4o*pdDQpLz6rUK3Ul=F_Sgl6`o)k-0TQ5IT}=z@5c>tRkvFYqv{f@d7e}; zhgC;k8Doup#ypXqRfQKKL@HRx+G>teoMZNmTt9NdDYxu{G^i}cQ4FDST@WPpT9I@0 za)11b;`H?W{Cauv3F8{0&Gqhkq53O15ca$6Ab(pq{j zR9o;x&4i2$RlqUihAyI&yT)#wXsrU0Fi~#jdHdI!v`DA`$cnmId;4{)KNv$BLbkb(}0(n5>o zi_GIm(-dFD6j9Bc{1u`r9BB${dc8eVK3nQy#P$P^e%;39oT^70;vmt;-Q5DRj+lVV z%-Pf^A3?HQ(72aVUH&8C#sPx>`s4o3ZFzON+3mN!(!|am?H8AqB&ouuJTO5d@E?K6 z#pEzK2S)5)R}K3`YNTBu0ua+(?_GseqqL4n=oL4x2&al;ioA^1f-NVb29=fK?RMi0 zrx92Evf2Y~e^9SK7Wdl-wpNhsEXJd$w*1qAZH%xp^<5GK;YCXcBmmP-kHZU9}3 zoN~AFJNBGRt+tKK(cGy`+8Hg)KKD^!5?M+#@@uvaQc$n$T4?OX9a{`Y<$H%YYNYT> zD%oGWniC1+dZ0Ped;5ADzC0eW>Nb@&^it(HJCouD0i0kM25txbm1p73P87i)a7y&4 zLuNz#UsIotInHzN=Q+-P2PgK+L$cJ%{trCnp4>3&6(n>9E0INVK`AON&a>H-kn)hX z*cjPLl-DN_M1+{5gF>QC;o|LfiLvZ<4g$A&5y>U{fj!vhRfx@T91dF}JS>A7+~wB$ z9Ay^fl$p~G?OLfrD9FU=CoI#-B9YtB#URfSdE>G9otCT`P7XI?(IEy z4-NZzsaSYU(UlkOZ-4&k`W1^a}2BA=7^5_S)x*WSM zrQl&+mxU+Qfjn8`k0Ty{dqbed^(&7B@vvKCPI0| z;2L4c}3ZB&Jn!*G_BEt>7p+$^HtdYlisjWNl4q3f! z(-xX%W7mZR6Rqowq90Z)>{ z2f%zs{om;TWI>z068yeq8XnPEvD*BPX&oUvxFjsqh%8u~n&L?1RCb9N1SdKppv7Yr z&u$Uk)pg6Kr)$*g1IAfJO!GARlLDE85I*Yj%|g z7G(fhvVYvla&Gp1^C4s7%0Le(VW6!X^n2_?j(&@w*vHAi&1x_j@iB|nZDxAA`!(Wn zu}8AFww#Ilc%-`xvY|^vI*UyEC_GpqM76Bg$x2?v^-6ZqWef--VNEVV1AE=3@W|1~ zoEhOTo=4zZ(C@8u^`T}DRMTzhZm6ZoZ_0cJ#9+;^=T~du#P*&K2d0Y|OH<0O?8`$_e%-Q4E8{H)_TMT^m>z!UI8*m(yO zH>u+%49dedfW0eWyh6_0s$wuc*%ih}ye36ulEjF9;zvO(iRK(hE3oy>F&nkPCxPRr z_K=M6!S|HsioevxaDR*(1rPBI;Xg5i4t`k_;z&HKju9t`;$X5b2aJqy$@-%-$=`iH zB+hUg=Q+;o8PBG3^%vpK!=H~iALD!(C*og(pSwQ}p+Z*dFAR>N^VcI2W9&}Mlu4VA_8PT4)2tKCtc69}#o1a+V zd>B8#*;Y-BVGQ5A>F%C0gtf3k6dQfAKztZ@EcOh5_c0>eu~e_)PxyA%CAleiP98z$ z8Jy#@XD0!`Mkg%Yqbf#Mk3oxAI`B^!15ZhbjzH;dL1OIEucGwcrpDWA4M+)0i3D+~ zFC<|4g9p|h_P?ZGP0C?zc{q#!F~6!$5`*?n23XH;chB@^prO551NEHDrXq-7mEHEG>}qe%f>-`Dn6!h1{QKs@XqBZ=gnD zSsx7>{{Y2KagA1YD+5I6X+k1IP&mQ+rpQnV@eJ!doO#k_;Z}+KOS;lY~C*$7XJVR71_$Fl4Dy$f#DuJor2}eXO*iux2<^& zc1phW=ESLDX7q{1Y4xj4f;_N;YFMjVMiW3-?R99A_tFKI=)0qkVb3LM2PRlb<)Qas zh9Nl#^f_(0o%uXtdZ^84<~hc6YpK-2U&7#e^XZDCJ&zdw03n-n?S|U+1kI&kQD7na z#W!Op_$!6ylnsT``U{1l{)o=#&-z$If73bGpU7~c{Fggae+j~a{&TSBZg%`4u;`u} z0VIADZ|fACA5b{@-8mO8EV!QzGmnV$&VH!)bMWWlJ@G#i;K>gzJ`;WegF1tQbm2~M z5T8yt!K>FF_7#pDHn98at6|aVzp#TofYkp0V-|j|>c6xD27_Djg~ojYL*yqJR=QPy zLm6^_{Xv5!@cB;>xHdg3VffwHRMtb|+rT z6ArGlXWsSLs6paLc{Zh*?SmxE>q4ng7>~8GzXrae%PSubX|}hwxzDdX7t?6_d7;|D z%f`NdXXzcgH1!ucEdK!LU}rxbrBF9h=F`@dcE!Q<1{@eL`y8{>5!a;zV40_nX9Tar z%3{k`=~axfI@y-9VsS7z(R4&~gpiK_9hXC99pkV(1y!|J|*=B_Q04V`R!;`P^XD8>MqDl!4 zs@?GXk)2t!8r@rjZY7bN1FZACy2N)V7)6p4XEKx-lL8q zWtLkG z>AF?(@`%9fQ<@Fs%^l%tqh^b9Q+Y&NsQ55o!GkY)(XoT!ZV0EREK)+RE|o7KjV{?1 z8xQ#01Z3&)`fB{ro2lO zuM;tS_N9lVTut_*)`N)@v>WYAPD!lnC+a;E(UcV@2IkLMEH06x-OmJ4p&&<|1Yr9N zU=yA)&jsYkle8(#f1^kOJaZj#ufZ+Oo;K768*rkK<>+rNVo1cNr*HJ}8JXJuJeV3WFpc@IC zImm*Dq~xA!4^ft-63htpOxGuiW;DxpBcWW$A@s3kOLO^|eNMi)ek67EyKWkAJG&m< zY;3IuXp6s2^tC-n^Cl#Foi?5QPt-Et9B1h>{I0PxqCe>J4}icks@ILn<=?fatk}O% zL36+y{Zo=Jt7GKng+8QX$Q{o<#%0OnUz20H{%wTE$0d#y=hz%Pobb+T<3xZv09rYK zUIsMEPaK1raEUBIy&Lpz(|jUs?We$C_zW07?|(|wO#L*Ik9cmOPYTX@@yf7pN)hkI zOe5g?@%kRxTX}A3&#g{CQcs}j8?U+B$ics6nhy%ZpyY9hpRexo2i(Ga9N-uC?d2H&Krk_;F7c6!9i&H90=u!!ZE9f}L`7Ck$5aeUh zJnGTUQ>%RI@Gab5kOMA{*r&}!IBzZJrCgpCtud)PeXgR={U_Z#2p0VdveBD{=ZZHL z!UtC89yO2x*>atVv&t+EUT92zX?;~rXm?jMm)6}!%?9qK_JFle;P?y~XmeI!i}2?O z&VB^_en-~lAJucI7t$ucbDyr`k%I;gk2s$d$oL=v>@cY0xkstP)P;{2sK4=n6ncdiNFz5f72E9><+rRNK`1=sA@{@K0f(`cM|CY-IX#Y9 ze7Wb);H*#aV5r;@7-x}xPqw+_+m3t28ZvXodgE1f;FetS?d$3@%Sp)g&jLURKlWkeA|h&_|rIr^OEI9uQ_e}cZRiSF3v4?ZWtPj80h3tW`o z0|KeV_x}KlP+QPoL;nC6d0#{D8OZ(~aA5eJc^nTx{{YXz-|t7T%hzjBfX`x3iMQ%o zJ16q>d4dk1hIH^u$g!EWQ@)ufeSr>Zs~b%sDFDX&3>cZ93b#^s1jlO3*Jm?Ka)m~j z#E!m~EyG5$ySd@E;`Q|N942WsDMlWB9%WTg$@Co$_tmx=50-WM8Sm-qXGKbhskH9F z5`WSSB)8#3N_k=*4z5l%VB?xfmrZt9^BwL&IZnLez^Ytx9ji^N9?h{Y~X|FNWnb3ao>*Y z--wf+p?_VL&pMjpK}6PvlPHE5)UR?VeRWwSX=RdE%CT0e>nt^s#Fpi$n6u90`}&ej z0>jye#gb9&ESN1>9@EL6NZtPB@%9%c`!Y;fWaEX%c_ieYgp5EyPeL=Q7#^rZ`NRHp z-yX^{X>zSf%(iSt3F)8TUe2qP;_B$aH>Jw5QPlmE$)PFgzR8-6&Ak=GxlQjx>kOEl!{N?z z@b1oYoaZ^tbDZbn&&QvGduLH6HG99p?Z5}-Fai0DDj07fCe za!*l@_}?x1%NpcAW<<`0by#QbK_bwx-$DYg9wD^6oA}|042Lh)#6Cyt(o=1WesPuAAO;@ydUQF~zc4}m`( zJ^*0)#}C3kbBcHkgy-@6AJh!zF2o*b4ozEw?Sc}d;&pb*`QbSSSlundm;fDfvO;)* zu>-Dd{{UxS4_;euSEUXPyO-y$OisEiKr|F#>!b`vkipk*eCR$WQO3v|RFf<9EEBN; zw7~s05A?a5<QC>-Rf37(N5)4})cpM6zS%<;jfTKA6~& z9El!enftvafKy8KSB^R*_`hW{oWEKtv}dU><~cZw_+ayd;tp~;=G46`()ti^d`2Sw z0N?(W_bdz=gurm&7^u=Z#)?_GYh5mmvz48ecIA&QOCN_HU4I&kemDan`Qx|QIGhNT zkEV6ug!T2K0&psNn+@|B*WkVVYM)ipxDYuGwz9R^xc3P*&|%r!Rvys&x*C zZ8@3{68%e4Qkz>I*41e9e4)4g}BzuFLoaZ}+7S7?F+1;GyInD!|=Q+-IXE;6wH;dgu zU-11hF&E672^I+A{{Wm2N1g)Ufpfvn1m?e04DiV{n_dFgtRQl|{lU|L&M@X;GDFRt zayI*M=SW*x-e9_StQ#m=5L3lL9>zaqmQ~2MX~+p?MKNtxl?iReTG~@-M6$ce`;L6f ziSnYZT=pqq$!QO3){~VpatML5UlP4nj?7BZ!5wqRk~M5f@ClkHTzaubAd!bLwRA!U zsBbF>JahME7)mU|zrI>=gm~54C5?F#p6oWB{-N4bAvhh~d5X(E>07&m$FA zklc*mHze_aLFAq=0qRHxD^N>QGQFfl*=vml?eP{x=hp|QBPyzzFuxh83ncPqf}X?- znxu1~Mjnx?53v6Lj#_IpeZ$e|AdqKJr)KKV#mU*86)eSz{{WRA6hhvY45trDT{ayg5scIW_2l%OY5Zol$U<*nYv z{o3Mtk04&A-2CshCsb}fyvm!K@6@x|dHI%}(%lJdK?ADC)yvM9wp8j}iq?n*h^@Y; z-B@u#h>Y2NRJyHTp5>S#O;1rM6y{=3XETCeKtUd$&+?7ySm@4%~%x*U~F8iW-r@^zP0B!AGk00Q#<4hxk zAmSXC@G#5PO+9PQ{)ebZZm(c{O%cp)*fXwy^R#oN&+V79t^GQVwiD`d&3NrXVwHJY zm0py-4E&h)`XRIiXn0%oXR$@Vl^qs^#GOY6EmVs11}7MGlEH7XRrKAdH{=RE0nIkr z-k$PYr7vW?G1OH$ijR*6*qCAb4VN@<+nuI1uEa-Aaq63GlI1;Gz|Lm3a==YBrG`a2 ztIX$1v-xlA=g~WVmi_bSz30n#m^It){KN-5hfoh~oj1W#sK2_`91wL6^XnTtKBE3j zV_;sQ9`$vHIp6&C)Ef)$zIv)>JZHaS{+;BUOW;i8(<~SyC{8%TG^TA?I&pgb9LYC!xcH@kBOAL5Q z&*Ba{Uy&&}URcU1@O(~`jb^hXF5RMSOi@OS4f1l%phF3GwoK;Eo$JE#$FgTKY3GUu zopvO%=x35Y8Llgx&pvGaT3g>n-SY+nn;)tw&G_}JhkFNkDFY}Q;JaZX3-pAYp9!a?eo1|A7)kwF+TJ#=n8EF6$W8FeoG;-O*4U<9$0 zog)PB@sT);6TprYj!7PJCEND+3EuG%3XjErf8rQ5nnc9 zI4v*QJkwC^Idjr!a%1VnUmS+XSA`gT z4lWXVPE8BXW4k&>T{KfY(m0E#t|q@lJmusQ_}xK6OFg^yB!UHInr4y7CC}O!(%RFs z+r?NpK)O$%_L|xJmyst#s(Y?je$AkiVE5qFtBsQ&=F{UYuDjL(!-0FGp@%Q+NU`6KMjt)EAVzX?RjF7w2fNQl|4nJJ5*Og#oD%Ir!hwi zriJC52d}K%lOR`Kb7M|;EzHx7T4;MgbRK}_pJ#7VbuLnr$1h9u9ZsRA;>E;s{{RX2 zfByh~$Kwdj25>$W6nb(w2T82{#vD35XZCUD&>Fw(27a$&EwWr!?bM;P-%6aqkPM`JX&(#XwD^us{bYCly;pp}L^|SRre|mHELH<`p z9+8{nay~KMvvf=OgpZf9E^D{v%s_cCc_<- z{{Ts{-RpJa1H&O`o3bo&EN%o|Apn@4KHv1;Id7UicYa~BynoJki=HZfHh8K0!#qU( zVTMINF^u52P|MxsyL}2AhT4STkn`r#`5PKe#xfN>zJ4F&d^X~CP77dQM=R@x=Z<+8 zaw!NNK-CpNnCZ|#YrLltRJO>n%LS}EeZXD=L4^`+pO6IoN&8`d6im-aAmrY#sj z?Wut$@9_!ar*}U@JH#OduGY;vQ7BH?@VeKGvofh>x4yV4(TtSUQ;%OtC=@3qLUWuM zva~7dtl1}l(Qq2wGf7|Zh8SedwAagfT$XBc=K4|3(t97zsZc(u=4$$mEq6=ONH~_} zi>GG4G1+blwkcImssLNh`xMv?1Dxk}1{fOwz;GPnoY)>L$}()W0p}!M-3YgJ07E&B!9UpfOfDy2|hzQNdExq z(0qCL@yYsw;U5A;#$Zkd`&i@x2seeQsIY$hwLh??7*VfHw zuE1h(m#NE6c8WohMe12bMsud*o~^GtR$~;}9poE&-h~p%`+a^#)hGM`mPgpd^-yz+ z3U) zN;%2UPqv=BdW)2zimc@iuTMKI={tQ))%Fm>-t`$#y!eB-)|a=Cm%(@`9+6OUB7}OkEe-~fU3Fl3~G7o&!OTT$m1JWs(s%Ez7l^M zf^|s4(T+>43+Qv`#QDjTbQP`ESyRKq(vkjYk#wJ9^WKLm>Z6PR&_r=)R{qu;@)dq{ zBE_Rq=UFi8Y5xFjGw8~H(K+;0Kje^S(N#Ywu98I0;fp^i|w#!REjXTB%CK)-d9 zdSjo4h8pvkBbF%3Y|tgi6?o#5B6xu1Mr?=%smp{cmAwX9{pL(aQO0m{MXi@>w1Sjb zw9!!3P>4ofDzJjdgVPiaK3P)!sPxFUuac zfG*jkC)bWo0~6LVG7z%DW6fr&oreDaINY6da5*(gy2S*HD9=jxocUD2@E9uiPfe zrU1o9p}?*Dr#L^6_*kzMn2d8EVSbZPe+q6|zfkDL(R7l)vl4wjws>ure)W+W0*(4b!>Fup6nnj^3=>*$-bvl#9TVHldlj(J7 zdV3MieQ7qMNgW-G7QUR0W$1@NYh+o}V01ptr{aDNcwBs6{-vKcor769AoJ7D`+Jd% zzj;f7(krh20P!RDf}2RBh?P(pPN=_D%}A@O8u$99NtYT~ZA=4&3>igmT#*0Wx#QILF}x(!@MSoTJ%xk^7wT(As$7MT_5T z$@eOgB&ElWBW_0)Jzp$*vz+}LMXsW+va@m_KUCk>gobyy5l7zD7U7xsSl6lbtsD3= zvq=$>)%aJqw7pGa_{ zA$bwiAZ3~{Bx=tZ0qkOvKF7%)Ip80#_@#d)80gb&WGi(?W5i6$QX^o23FwouIK4WoJic+*+lZtc0gJ6_hP>j z!A?NtD3&z{pauGa;6LuaNxL+o(=P}5to-56(H4;%=iN>3`cbSQ>badC*Rivs{{ZW$ zhY!~uALAI_=M&uFl{;UC1oY=k1a-AP3}L9SalrLw5Wys*fFsu#ufZI*Ei_$GuC1(| zrAl!HP0A3^HYZPOQk82KVIB0PmUI#cB^V^Kp4ROy3pW1%zP2%T8wK{+To{{eviohV z`fHI(CehHY^0-{ z*!0x{(WhqUQs%c&xOx%YuU2NQ(sVW!{C9>}Bg-*-x)mxwL@p`9nSPwFpCda8DUQ58)q1o>?dw6Ix)uJP(cYpahSUP)m z{p|yXL%#VLMuqCKWlzR0-wtWBj6586jQ|UOp54qT7&PduZ`2% zZ|ot;wV|g1!2$^5i&H`!fxi?TmM`?iuJo-bM}_rT9e%0AutZ*2IzLw{vzM|7=&fhU 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 >Wrgt=_p55*<>^VfTj`;S~b&;O0 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 Date: Thu, 8 Feb 2024 14:52:16 +0300 Subject: [PATCH 06/27] =?UTF-8?q?WEB=20APP:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0"=20-=20=D1=80?= =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20?= =?UTF-8?q?=D0=B8=D0=BC=D1=91=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=20=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2,=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85?= =?UTF-8?q?=20=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} > - Date: Thu, 8 Feb 2024 14:53:02 +0300 Subject: [PATCH 07/27] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 362 ++++++++++++---------------------------------- 1 file changed, 93 insertions(+), 269 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index b30f64b..c50afce 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -15,7 +15,7 @@ \***********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var map = {\n\t\"./alex\": \"./app/panels/alex/index.js\",\n\t\"./alex/\": \"./app/panels/alex/index.js\",\n\t\"./alex/alex\": \"./app/panels/alex/alex.js\",\n\t\"./alex/alex.js\": \"./app/panels/alex/alex.js\",\n\t\"./alex/index\": \"./app/panels/alex/index.js\",\n\t\"./alex/index.js\": \"./app/panels/alex/index.js\",\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_agn_info\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/TabsElements/agentChart\": \"./app/panels/prj_agn_info/TabsElements/agentChart.js\",\n\t\"./prj_agn_info/TabsElements/agentChart.js\": \"./app/panels/prj_agn_info/TabsElements/agentChart.js\",\n\t\"./prj_agn_info/TabsElements/agentContracts\": \"./app/panels/prj_agn_info/TabsElements/agentContracts.js\",\n\t\"./prj_agn_info/TabsElements/agentContracts.js\": \"./app/panels/prj_agn_info/TabsElements/agentContracts.js\",\n\t\"./prj_agn_info/TabsElements/agentInfo\": \"./app/panels/prj_agn_info/TabsElements/agentInfo.js\",\n\t\"./prj_agn_info/TabsElements/agentInfo.js\": \"./app/panels/prj_agn_info/TabsElements/agentInfo.js\",\n\t\"./prj_agn_info/back\": \"./app/panels/prj_agn_info/back.js\",\n\t\"./prj_agn_info/back.js\": \"./app/panels/prj_agn_info/back.js\",\n\t\"./prj_agn_info/index\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/index.js\": \"./app/panels/prj_agn_info/index.js\",\n\t\"./prj_agn_info/prj_agn_info\": \"./app/panels/prj_agn_info/prj_agn_info.js\",\n\t\"./prj_agn_info/prj_agn_info.js\": \"./app/panels/prj_agn_info/prj_agn_info.js\",\n\t\"./prj_agn_info/tabs\": \"./app/panels/prj_agn_info/tabs.js\",\n\t\"./prj_agn_info/tabs.js\": \"./app/panels/prj_agn_info/tabs.js\",\n\t\"./prj_agn_info/utils\": \"./app/panels/prj_agn_info/utils.js\",\n\t\"./prj_agn_info/utils.js\": \"./app/panels/prj_agn_info/utils.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); +eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); /***/ }), @@ -1603,50 +1603,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./node_modules/@mui/material/TabScrollButton/TabScrollButton.js": -/*!***********************************************************************!*\ - !*** ./node_modules/@mui/material/TabScrollButton/TabScrollButton.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/base/utils/useSlotProps.js\");\n/* harmony import */ var _internal_svg_icons_KeyboardArrowLeft__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../internal/svg-icons/KeyboardArrowLeft */ \"./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js\");\n/* harmony import */ var _internal_svg_icons_KeyboardArrowRight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../internal/svg-icons/KeyboardArrowRight */ \"./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ButtonBase */ \"./node_modules/@mui/material/ButtonBase/ButtonBase.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../styles/useTheme */ \"./node_modules/@mui/material/styles/useTheme.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _tabScrollButtonClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tabScrollButtonClasses */ \"./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n/* eslint-disable jsx-a11y/aria-role */\n\n\nconst _excluded = [\"className\", \"slots\", \"slotProps\", \"direction\", \"orientation\", \"disabled\"];\n\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n orientation,\n disabled\n } = ownerState;\n const slots = {\n root: ['root', orientation, disabled && 'disabled']\n };\n return (0,_mui_base__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(slots, _tabScrollButtonClasses__WEBPACK_IMPORTED_MODULE_6__.getTabScrollButtonUtilityClass, classes);\n};\nconst TabScrollButtonRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ButtonBase__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n name: 'MuiTabScrollButton',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.orientation && styles[ownerState.orientation]];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n width: 40,\n flexShrink: 0,\n opacity: 0.8,\n [`&.${_tabScrollButtonClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"].disabled}`]: {\n opacity: 0\n }\n}, ownerState.orientation === 'vertical' && {\n width: '100%',\n height: 40,\n '& svg': {\n transform: `rotate(${ownerState.isRtl ? -90 : 90}deg)`\n }\n}));\nconst TabScrollButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function TabScrollButton(inProps, ref) {\n var _slots$StartScrollBut, _slots$EndScrollButto;\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__[\"default\"])({\n props: inProps,\n name: 'MuiTabScrollButton'\n });\n const {\n className,\n slots = {},\n slotProps = {},\n direction\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const theme = (0,_styles_useTheme__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const isRtl = theme.direction === 'rtl';\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n isRtl\n }, props);\n const classes = useUtilityClasses(ownerState);\n const StartButtonIcon = (_slots$StartScrollBut = slots.StartScrollButtonIcon) != null ? _slots$StartScrollBut : _internal_svg_icons_KeyboardArrowLeft__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\n const EndButtonIcon = (_slots$EndScrollButto = slots.EndScrollButtonIcon) != null ? _slots$EndScrollButto : _internal_svg_icons_KeyboardArrowRight__WEBPACK_IMPORTED_MODULE_12__[\"default\"];\n const startButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: StartButtonIcon,\n externalSlotProps: slotProps.startScrollButtonIcon,\n additionalProps: {\n fontSize: 'small'\n },\n ownerState\n });\n const endButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: EndButtonIcon,\n externalSlotProps: slotProps.endScrollButtonIcon,\n additionalProps: {\n fontSize: 'small'\n },\n ownerState\n });\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(TabScrollButtonRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n component: \"div\",\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n ref: ref,\n role: null,\n ownerState: ownerState,\n tabIndex: null\n }, other, {\n children: direction === 'left' ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(StartButtonIcon, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, startButtonIconProps)) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(EndButtonIcon, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, endButtonIconProps))\n }));\n});\n true ? TabScrollButton.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * The content of the component.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().node),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n /**\n * The direction the button should indicate.\n */\n direction: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOf(['left', 'right']).isRequired,\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool),\n /**\n * The component orientation (layout flow direction).\n */\n orientation: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOf(['horizontal', 'vertical']).isRequired,\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n * @default {}\n */\n slotProps: prop_types__WEBPACK_IMPORTED_MODULE_14___default().shape({\n endScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)]),\n startScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)])\n }),\n /**\n * The components used for each slot inside.\n * @default {}\n */\n slots: prop_types__WEBPACK_IMPORTED_MODULE_14___default().shape({\n EndScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().elementType),\n StartScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().elementType)\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)])\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TabScrollButton);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/TabScrollButton/TabScrollButton.js?"); - -/***/ }), - -/***/ "./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js": -/*!******************************************************************************!*\ - !*** ./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js ***! - \******************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getTabScrollButtonUtilityClass: () => (/* binding */ getTabScrollButtonUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getTabScrollButtonUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiTabScrollButton', slot);\n}\nconst tabScrollButtonClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiTabScrollButton', ['root', 'vertical', 'horizontal', 'disabled']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tabScrollButtonClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/TabScrollButton/tabScrollButtonClasses.js?"); - -/***/ }), - -/***/ "./node_modules/@mui/material/Tab/Tab.js": -/*!***********************************************!*\ - !*** ./node_modules/@mui/material/Tab/Tab.js ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ButtonBase */ \"./node_modules/@mui/material/ButtonBase/ButtonBase.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./node_modules/@mui/material/utils/capitalize.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _utils_unsupportedProp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/unsupportedProp */ \"./node_modules/@mui/material/utils/unsupportedProp.js\");\n/* harmony import */ var _tabClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tabClasses */ \"./node_modules/@mui/material/Tab/tabClasses.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"className\", \"disabled\", \"disableFocusRipple\", \"fullWidth\", \"icon\", \"iconPosition\", \"indicator\", \"label\", \"onChange\", \"onClick\", \"onFocus\", \"selected\", \"selectionFollowsFocus\", \"textColor\", \"value\", \"wrapped\"];\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n textColor,\n fullWidth,\n wrapped,\n icon,\n label,\n selected,\n disabled\n } = ownerState;\n const slots = {\n root: ['root', icon && label && 'labelIcon', `textColor${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(textColor)}`, fullWidth && 'fullWidth', wrapped && 'wrapped', selected && 'selected', disabled && 'disabled'],\n iconWrapper: ['iconWrapper']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _tabClasses__WEBPACK_IMPORTED_MODULE_7__.getTabUtilityClass, classes);\n};\nconst TabRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(_ButtonBase__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n name: 'MuiTab',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.label && ownerState.icon && styles.labelIcon, styles[`textColor${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ownerState.textColor)}`], ownerState.fullWidth && styles.fullWidth, ownerState.wrapped && styles.wrapped];\n }\n})(({\n theme,\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.button, {\n maxWidth: 360,\n minWidth: 90,\n position: 'relative',\n minHeight: 48,\n flexShrink: 0,\n padding: '12px 16px',\n overflow: 'hidden',\n whiteSpace: 'normal',\n textAlign: 'center'\n}, ownerState.label && {\n flexDirection: ownerState.iconPosition === 'top' || ownerState.iconPosition === 'bottom' ? 'column' : 'row'\n}, {\n lineHeight: 1.25\n}, ownerState.icon && ownerState.label && {\n minHeight: 72,\n paddingTop: 9,\n paddingBottom: 9,\n [`& > .${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].iconWrapper}`]: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, ownerState.iconPosition === 'top' && {\n marginBottom: 6\n }, ownerState.iconPosition === 'bottom' && {\n marginTop: 6\n }, ownerState.iconPosition === 'start' && {\n marginRight: theme.spacing(1)\n }, ownerState.iconPosition === 'end' && {\n marginLeft: theme.spacing(1)\n })\n}, ownerState.textColor === 'inherit' && {\n color: 'inherit',\n opacity: 0.6,\n // same opacity as theme.palette.text.secondary\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].selected}`]: {\n opacity: 1\n },\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n opacity: (theme.vars || theme).palette.action.disabledOpacity\n }\n}, ownerState.textColor === 'primary' && {\n color: (theme.vars || theme).palette.text.secondary,\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].selected}`]: {\n color: (theme.vars || theme).palette.primary.main\n },\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.text.disabled\n }\n}, ownerState.textColor === 'secondary' && {\n color: (theme.vars || theme).palette.text.secondary,\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].selected}`]: {\n color: (theme.vars || theme).palette.secondary.main\n },\n [`&.${_tabClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.text.disabled\n }\n}, ownerState.fullWidth && {\n flexShrink: 1,\n flexGrow: 1,\n flexBasis: 0,\n maxWidth: 'none'\n}, ownerState.wrapped && {\n fontSize: theme.typography.pxToRem(12)\n}));\nconst Tab = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function Tab(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n props: inProps,\n name: 'MuiTab'\n });\n const {\n className,\n disabled = false,\n disableFocusRipple = false,\n // eslint-disable-next-line react/prop-types\n fullWidth,\n icon: iconProp,\n iconPosition = 'top',\n // eslint-disable-next-line react/prop-types\n indicator,\n label,\n onChange,\n onClick,\n onFocus,\n // eslint-disable-next-line react/prop-types\n selected,\n // eslint-disable-next-line react/prop-types\n selectionFollowsFocus,\n // eslint-disable-next-line react/prop-types\n textColor = 'inherit',\n value,\n wrapped = false\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n disabled,\n disableFocusRipple,\n selected,\n icon: !!iconProp,\n iconPosition,\n label: !!label,\n fullWidth,\n textColor,\n wrapped\n });\n const classes = useUtilityClasses(ownerState);\n const icon = iconProp && label && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.isValidElement(iconProp) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(iconProp, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.iconWrapper, iconProp.props.className)\n }) : iconProp;\n const handleClick = event => {\n if (!selected && onChange) {\n onChange(event, value);\n }\n if (onClick) {\n onClick(event);\n }\n };\n const handleFocus = event => {\n if (selectionFollowsFocus && !selected && onChange) {\n onChange(event, value);\n }\n if (onFocus) {\n onFocus(event);\n }\n };\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(TabRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n focusRipple: !disableFocusRipple,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n ref: ref,\n role: \"tab\",\n \"aria-selected\": selected,\n disabled: disabled,\n onClick: handleClick,\n onFocus: handleFocus,\n ownerState: ownerState,\n tabIndex: selected ? 0 : -1\n }, other, {\n children: [iconPosition === 'top' || iconPosition === 'start' ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {\n children: [icon, label]\n }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(react__WEBPACK_IMPORTED_MODULE_2__.Fragment, {\n children: [label, icon]\n }), indicator]\n }));\n});\n true ? Tab.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * This prop isn't supported.\n * Use the `component` prop if you need to change the children structure.\n */\n children: _utils_unsupportedProp__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the keyboard focus ripple is disabled.\n * @default false\n */\n disableFocusRipple: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the ripple effect is disabled.\n *\n * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n * to highlight the element by applying separate styles with the `.Mui-focusVisible` class.\n * @default false\n */\n disableRipple: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * The icon to display.\n */\n icon: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_12___default().element), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string)]),\n /**\n * The position of the icon relative to the label.\n * @default 'top'\n */\n iconPosition: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOf(['bottom', 'end', 'start', 'top']),\n /**\n * The label element.\n */\n label: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().node),\n /**\n * @ignore\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * @ignore\n */\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * @ignore\n */\n onFocus: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_12___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_12___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object)]),\n /**\n * You can provide your own value. Otherwise, we fallback to the child position index.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().any),\n /**\n * Tab labels appear in a single row.\n * They can use a second line if needed.\n * @default false\n */\n wrapped: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tab);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tab/Tab.js?"); - -/***/ }), - -/***/ "./node_modules/@mui/material/Tab/tabClasses.js": -/*!******************************************************!*\ - !*** ./node_modules/@mui/material/Tab/tabClasses.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getTabUtilityClass: () => (/* binding */ getTabUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getTabUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiTab', slot);\n}\nconst tabClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiTab', ['root', 'labelIcon', 'textColorInherit', 'textColorPrimary', 'textColorSecondary', 'selected', 'disabled', 'fullWidth', 'wrapped', 'iconWrapper']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tabClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tab/tabClasses.js?"); - -/***/ }), - /***/ "./node_modules/@mui/material/TableBody/TableBody.js": /*!***********************************************************!*\ !*** ./node_modules/@mui/material/TableBody/TableBody.js ***! @@ -1801,39 +1757,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./node_modules/@mui/material/Tabs/ScrollbarSize.js": -/*!**********************************************************!*\ - !*** ./node_modules/@mui/material/Tabs/ScrollbarSize.js ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ScrollbarSize)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/debounce */ \"./node_modules/@mui/material/utils/debounce.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./node_modules/@mui/material/utils/useEnhancedEffect.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"./node_modules/@mui/material/utils/ownerWindow.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"onChange\"];\n\n\n\n\n\nconst styles = {\n width: 99,\n height: 99,\n position: 'absolute',\n top: -9999,\n overflow: 'scroll'\n};\n\n/**\n * @ignore - internal component.\n * The component originates from https://github.com/STORIS/react-scrollbar-size.\n * It has been moved into the core in order to minimize the bundle size.\n */\nfunction ScrollbarSize(props) {\n const {\n onChange\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, _excluded);\n const scrollbarHeight = react__WEBPACK_IMPORTED_MODULE_2__.useRef();\n const nodeRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const setMeasurements = () => {\n scrollbarHeight.current = nodeRef.current.offsetHeight - nodeRef.current.clientHeight;\n };\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(() => {\n const handleResize = (0,_utils_debounce__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(() => {\n const prevHeight = scrollbarHeight.current;\n setMeasurements();\n if (prevHeight !== scrollbarHeight.current) {\n onChange(scrollbarHeight.current);\n }\n });\n const containerWindow = (0,_utils__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(nodeRef.current);\n containerWindow.addEventListener('resize', handleResize);\n return () => {\n handleResize.clear();\n containerWindow.removeEventListener('resize', handleResize);\n };\n }, [onChange]);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n setMeasurements();\n onChange(scrollbarHeight.current);\n }, [onChange]);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n style: styles,\n ref: nodeRef\n }, other));\n}\n true ? ScrollbarSize.propTypes = {\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func).isRequired\n} : 0;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tabs/ScrollbarSize.js?"); - -/***/ }), - -/***/ "./node_modules/@mui/material/Tabs/Tabs.js": -/*!*************************************************!*\ - !*** ./node_modules/@mui/material/Tabs/Tabs.js ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./node_modules/@mui/material/node_modules/react-is/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/refType.js\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_base__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/base */ \"./node_modules/@mui/base/utils/useSlotProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/useTheme */ \"./node_modules/@mui/material/styles/useTheme.js\");\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../utils/debounce */ \"./node_modules/@mui/material/utils/debounce.js\");\n/* harmony import */ var _utils_scrollLeft__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/scrollLeft */ \"./node_modules/@mui/utils/esm/scrollLeft.js\");\n/* harmony import */ var _internal_animate__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../internal/animate */ \"./node_modules/@mui/material/internal/animate.js\");\n/* harmony import */ var _ScrollbarSize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ScrollbarSize */ \"./node_modules/@mui/material/Tabs/ScrollbarSize.js\");\n/* harmony import */ var _TabScrollButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../TabScrollButton */ \"./node_modules/@mui/material/TabScrollButton/TabScrollButton.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./node_modules/@mui/material/utils/useEventCallback.js\");\n/* harmony import */ var _tabsClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tabsClasses */ \"./node_modules/@mui/material/Tabs/tabsClasses.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./node_modules/@mui/material/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./node_modules/@mui/material/utils/ownerWindow.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"aria-label\", \"aria-labelledby\", \"action\", \"centered\", \"children\", \"className\", \"component\", \"allowScrollButtonsMobile\", \"indicatorColor\", \"onChange\", \"orientation\", \"ScrollButtonComponent\", \"scrollButtons\", \"selectionFollowsFocus\", \"slots\", \"slotProps\", \"TabIndicatorProps\", \"TabScrollButtonProps\", \"textColor\", \"value\", \"variant\", \"visibleScrollbar\"];\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst nextItem = (list, item) => {\n if (list === item) {\n return list.firstChild;\n }\n if (item && item.nextElementSibling) {\n return item.nextElementSibling;\n }\n return list.firstChild;\n};\nconst previousItem = (list, item) => {\n if (list === item) {\n return list.lastChild;\n }\n if (item && item.previousElementSibling) {\n return item.previousElementSibling;\n }\n return list.lastChild;\n};\nconst moveFocus = (list, currentFocus, traversalFunction) => {\n let wrappedOnce = false;\n let nextFocus = traversalFunction(list, currentFocus);\n while (nextFocus) {\n // Prevent infinite loop.\n if (nextFocus === list.firstChild) {\n if (wrappedOnce) {\n return;\n }\n wrappedOnce = true;\n }\n\n // Same logic as useAutocomplete.js\n const nextFocusDisabled = nextFocus.disabled || nextFocus.getAttribute('aria-disabled') === 'true';\n if (!nextFocus.hasAttribute('tabindex') || nextFocusDisabled) {\n // Move to the next element.\n nextFocus = traversalFunction(list, nextFocus);\n } else {\n nextFocus.focus();\n return;\n }\n }\n};\nconst useUtilityClasses = ownerState => {\n const {\n vertical,\n fixed,\n hideScrollbar,\n scrollableX,\n scrollableY,\n centered,\n scrollButtonsHideMobile,\n classes\n } = ownerState;\n const slots = {\n root: ['root', vertical && 'vertical'],\n scroller: ['scroller', fixed && 'fixed', hideScrollbar && 'hideScrollbar', scrollableX && 'scrollableX', scrollableY && 'scrollableY'],\n flexContainer: ['flexContainer', vertical && 'flexContainerVertical', centered && 'centered'],\n indicator: ['indicator'],\n scrollButtons: ['scrollButtons', scrollButtonsHideMobile && 'scrollButtonsHideMobile'],\n scrollableX: [scrollableX && 'scrollableX'],\n hideScrollbar: [hideScrollbar && 'hideScrollbar']\n };\n return (0,_mui_base__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _tabsClasses__WEBPACK_IMPORTED_MODULE_7__.getTabsUtilityClass, classes);\n};\nconst TabsRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('div', {\n name: 'MuiTabs',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [{\n [`& .${_tabsClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].scrollButtons}`]: styles.scrollButtons\n }, {\n [`& .${_tabsClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].scrollButtons}`]: ownerState.scrollButtonsHideMobile && styles.scrollButtonsHideMobile\n }, styles.root, ownerState.vertical && styles.vertical];\n }\n})(({\n ownerState,\n theme\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n overflow: 'hidden',\n minHeight: 48,\n // Add iOS momentum scrolling for iOS < 13.0\n WebkitOverflowScrolling: 'touch',\n display: 'flex'\n}, ownerState.vertical && {\n flexDirection: 'column'\n}, ownerState.scrollButtonsHideMobile && {\n [`& .${_tabsClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].scrollButtons}`]: {\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n }\n}));\nconst TabsScroller = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('div', {\n name: 'MuiTabs',\n slot: 'Scroller',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.scroller, ownerState.fixed && styles.fixed, ownerState.hideScrollbar && styles.hideScrollbar, ownerState.scrollableX && styles.scrollableX, ownerState.scrollableY && styles.scrollableY];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n position: 'relative',\n display: 'inline-block',\n flex: '1 1 auto',\n whiteSpace: 'nowrap'\n}, ownerState.fixed && {\n overflowX: 'hidden',\n width: '100%'\n}, ownerState.hideScrollbar && {\n // Hide dimensionless scrollbar on macOS\n scrollbarWidth: 'none',\n // Firefox\n '&::-webkit-scrollbar': {\n display: 'none' // Safari + Chrome\n }\n}, ownerState.scrollableX && {\n overflowX: 'auto',\n overflowY: 'hidden'\n}, ownerState.scrollableY && {\n overflowY: 'auto',\n overflowX: 'hidden'\n}));\nconst FlexContainer = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('div', {\n name: 'MuiTabs',\n slot: 'FlexContainer',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.flexContainer, ownerState.vertical && styles.flexContainerVertical, ownerState.centered && styles.centered];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'flex'\n}, ownerState.vertical && {\n flexDirection: 'column'\n}, ownerState.centered && {\n justifyContent: 'center'\n}));\nconst TabsIndicator = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('span', {\n name: 'MuiTabs',\n slot: 'Indicator',\n overridesResolver: (props, styles) => styles.indicator\n})(({\n ownerState,\n theme\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n position: 'absolute',\n height: 2,\n bottom: 0,\n width: '100%',\n transition: theme.transitions.create()\n}, ownerState.indicatorColor === 'primary' && {\n backgroundColor: (theme.vars || theme).palette.primary.main\n}, ownerState.indicatorColor === 'secondary' && {\n backgroundColor: (theme.vars || theme).palette.secondary.main\n}, ownerState.vertical && {\n height: '100%',\n width: 2,\n right: 0\n}));\nconst TabsScrollbarSize = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(_ScrollbarSize__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n name: 'MuiTabs',\n slot: 'ScrollbarSize'\n})({\n overflowX: 'auto',\n overflowY: 'hidden',\n // Hide dimensionless scrollbar on macOS\n scrollbarWidth: 'none',\n // Firefox\n '&::-webkit-scrollbar': {\n display: 'none' // Safari + Chrome\n }\n});\n\nconst defaultIndicatorStyle = {};\nlet warnedOnceTabPresent = false;\nconst Tabs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function Tabs(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n props: inProps,\n name: 'MuiTabs'\n });\n const theme = (0,_styles_useTheme__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const isRtl = theme.direction === 'rtl';\n const {\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n action,\n centered = false,\n children: childrenProp,\n className,\n component = 'div',\n allowScrollButtonsMobile = false,\n indicatorColor = 'primary',\n onChange,\n orientation = 'horizontal',\n ScrollButtonComponent = _TabScrollButton__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n scrollButtons = 'auto',\n selectionFollowsFocus,\n slots = {},\n slotProps = {},\n TabIndicatorProps = {},\n TabScrollButtonProps = {},\n textColor = 'primary',\n value,\n variant = 'standard',\n visibleScrollbar = false\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const scrollable = variant === 'scrollable';\n const vertical = orientation === 'vertical';\n const scrollStart = vertical ? 'scrollTop' : 'scrollLeft';\n const start = vertical ? 'top' : 'left';\n const end = vertical ? 'bottom' : 'right';\n const clientSize = vertical ? 'clientHeight' : 'clientWidth';\n const size = vertical ? 'height' : 'width';\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n component,\n allowScrollButtonsMobile,\n indicatorColor,\n orientation,\n vertical,\n scrollButtons,\n textColor,\n variant,\n visibleScrollbar,\n fixed: !scrollable,\n hideScrollbar: scrollable && !visibleScrollbar,\n scrollableX: scrollable && !vertical,\n scrollableY: scrollable && vertical,\n centered: centered && !scrollable,\n scrollButtonsHideMobile: !allowScrollButtonsMobile\n });\n const classes = useUtilityClasses(ownerState);\n const startScrollButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: slots.StartScrollButtonIcon,\n externalSlotProps: slotProps.startScrollButtonIcon,\n ownerState\n });\n const endScrollButtonIconProps = (0,_mui_base__WEBPACK_IMPORTED_MODULE_13__.useSlotProps)({\n elementType: slots.EndScrollButtonIcon,\n externalSlotProps: slotProps.endScrollButtonIcon,\n ownerState\n });\n if (true) {\n if (centered && scrollable) {\n console.error('MUI: You can not use the `centered={true}` and `variant=\"scrollable\"` properties ' + 'at the same time on a `Tabs` component.');\n }\n }\n const [mounted, setMounted] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [indicatorStyle, setIndicatorStyle] = react__WEBPACK_IMPORTED_MODULE_2__.useState(defaultIndicatorStyle);\n const [displayStartScroll, setDisplayStartScroll] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [displayEndScroll, setDisplayEndScroll] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [updateScrollObserver, setUpdateScrollObserver] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n const [scrollerStyle, setScrollerStyle] = react__WEBPACK_IMPORTED_MODULE_2__.useState({\n overflow: 'hidden',\n scrollbarWidth: 0\n });\n const valueToIndex = new Map();\n const tabsRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const tabListRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const getTabsMeta = () => {\n const tabsNode = tabsRef.current;\n let tabsMeta;\n if (tabsNode) {\n const rect = tabsNode.getBoundingClientRect();\n // create a new object with ClientRect class props + scrollLeft\n tabsMeta = {\n clientWidth: tabsNode.clientWidth,\n scrollLeft: tabsNode.scrollLeft,\n scrollTop: tabsNode.scrollTop,\n scrollLeftNormalized: (0,_utils_scrollLeft__WEBPACK_IMPORTED_MODULE_14__.getNormalizedScrollLeft)(tabsNode, theme.direction),\n scrollWidth: tabsNode.scrollWidth,\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right\n };\n }\n let tabMeta;\n if (tabsNode && value !== false) {\n const children = tabListRef.current.children;\n if (children.length > 0) {\n const tab = children[valueToIndex.get(value)];\n if (true) {\n if (!tab) {\n console.error([`MUI: The \\`value\\` provided to the Tabs component is invalid.`, `None of the Tabs' children match with \"${value}\".`, valueToIndex.keys ? `You can provide one of the following values: ${Array.from(valueToIndex.keys()).join(', ')}.` : null].join('\\n'));\n }\n }\n tabMeta = tab ? tab.getBoundingClientRect() : null;\n if (true) {\n if ( true && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && tabMeta.height === 0 &&\n // if the whole Tabs component is hidden, don't warn\n tabsMeta.clientWidth !== 0) {\n tabsMeta = null;\n console.error(['MUI: The `value` provided to the Tabs component is invalid.', `The Tab with this \\`value\\` (\"${value}\") is not part of the document layout.`, \"Make sure the tab item is present in the document or that it's not `display: none`.\"].join('\\n'));\n warnedOnceTabPresent = true;\n }\n }\n }\n }\n return {\n tabsMeta,\n tabMeta\n };\n };\n const updateIndicatorState = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(() => {\n const {\n tabsMeta,\n tabMeta\n } = getTabsMeta();\n let startValue = 0;\n let startIndicator;\n if (vertical) {\n startIndicator = 'top';\n if (tabMeta && tabsMeta) {\n startValue = tabMeta.top - tabsMeta.top + tabsMeta.scrollTop;\n }\n } else {\n startIndicator = isRtl ? 'right' : 'left';\n if (tabMeta && tabsMeta) {\n const correction = isRtl ? tabsMeta.scrollLeftNormalized + tabsMeta.clientWidth - tabsMeta.scrollWidth : tabsMeta.scrollLeft;\n startValue = (isRtl ? -1 : 1) * (tabMeta[startIndicator] - tabsMeta[startIndicator] + correction);\n }\n }\n const newIndicatorStyle = {\n [startIndicator]: startValue,\n // May be wrong until the font is loaded.\n [size]: tabMeta ? tabMeta[size] : 0\n };\n\n // IE11 support, replace with Number.isNaN\n // eslint-disable-next-line no-restricted-globals\n if (isNaN(indicatorStyle[startIndicator]) || isNaN(indicatorStyle[size])) {\n setIndicatorStyle(newIndicatorStyle);\n } else {\n const dStart = Math.abs(indicatorStyle[startIndicator] - newIndicatorStyle[startIndicator]);\n const dSize = Math.abs(indicatorStyle[size] - newIndicatorStyle[size]);\n if (dStart >= 1 || dSize >= 1) {\n setIndicatorStyle(newIndicatorStyle);\n }\n }\n });\n const scroll = (scrollValue, {\n animation = true\n } = {}) => {\n if (animation) {\n (0,_internal_animate__WEBPACK_IMPORTED_MODULE_16__[\"default\"])(scrollStart, tabsRef.current, scrollValue, {\n duration: theme.transitions.duration.standard\n });\n } else {\n tabsRef.current[scrollStart] = scrollValue;\n }\n };\n const moveTabsScroll = delta => {\n let scrollValue = tabsRef.current[scrollStart];\n if (vertical) {\n scrollValue += delta;\n } else {\n scrollValue += delta * (isRtl ? -1 : 1);\n // Fix for Edge\n scrollValue *= isRtl && (0,_utils_scrollLeft__WEBPACK_IMPORTED_MODULE_14__.detectScrollType)() === 'reverse' ? -1 : 1;\n }\n scroll(scrollValue);\n };\n const getScrollSize = () => {\n const containerSize = tabsRef.current[clientSize];\n let totalSize = 0;\n const children = Array.from(tabListRef.current.children);\n for (let i = 0; i < children.length; i += 1) {\n const tab = children[i];\n if (totalSize + tab[clientSize] > containerSize) {\n // If the first item is longer than the container size, then only scroll\n // by the container size.\n if (i === 0) {\n totalSize = containerSize;\n }\n break;\n }\n totalSize += tab[clientSize];\n }\n return totalSize;\n };\n const handleStartScrollClick = () => {\n moveTabsScroll(-1 * getScrollSize());\n };\n const handleEndScrollClick = () => {\n moveTabsScroll(getScrollSize());\n };\n\n // TODO Remove as browser support for hiding the scrollbar\n // with CSS improves.\n const handleScrollbarSizeChange = react__WEBPACK_IMPORTED_MODULE_2__.useCallback(scrollbarWidth => {\n setScrollerStyle({\n overflow: null,\n scrollbarWidth\n });\n }, []);\n const getConditionalElements = () => {\n const conditionalElements = {};\n conditionalElements.scrollbarSizeListener = scrollable ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(TabsScrollbarSize, {\n onChange: handleScrollbarSizeChange,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.scrollableX, classes.hideScrollbar)\n }) : null;\n const scrollButtonsActive = displayStartScroll || displayEndScroll;\n const showScrollButtons = scrollable && (scrollButtons === 'auto' && scrollButtonsActive || scrollButtons === true);\n conditionalElements.scrollButtonStart = showScrollButtons ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(ScrollButtonComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n slots: {\n StartScrollButtonIcon: slots.StartScrollButtonIcon\n },\n slotProps: {\n startScrollButtonIcon: startScrollButtonIconProps\n },\n orientation: orientation,\n direction: isRtl ? 'right' : 'left',\n onClick: handleStartScrollClick,\n disabled: !displayStartScroll\n }, TabScrollButtonProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.scrollButtons, TabScrollButtonProps.className)\n })) : null;\n conditionalElements.scrollButtonEnd = showScrollButtons ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(ScrollButtonComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n slots: {\n EndScrollButtonIcon: slots.EndScrollButtonIcon\n },\n slotProps: {\n endScrollButtonIcon: endScrollButtonIconProps\n },\n orientation: orientation,\n direction: isRtl ? 'left' : 'right',\n onClick: handleEndScrollClick,\n disabled: !displayEndScroll\n }, TabScrollButtonProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.scrollButtons, TabScrollButtonProps.className)\n })) : null;\n return conditionalElements;\n };\n const scrollSelectedIntoView = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(animation => {\n const {\n tabsMeta,\n tabMeta\n } = getTabsMeta();\n if (!tabMeta || !tabsMeta) {\n return;\n }\n if (tabMeta[start] < tabsMeta[start]) {\n // left side of button is out of view\n const nextScrollStart = tabsMeta[scrollStart] + (tabMeta[start] - tabsMeta[start]);\n scroll(nextScrollStart, {\n animation\n });\n } else if (tabMeta[end] > tabsMeta[end]) {\n // right side of button is out of view\n const nextScrollStart = tabsMeta[scrollStart] + (tabMeta[end] - tabsMeta[end]);\n scroll(nextScrollStart, {\n animation\n });\n }\n });\n const updateScrollButtonState = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_15__[\"default\"])(() => {\n if (scrollable && scrollButtons !== false) {\n setUpdateScrollObserver(!updateScrollObserver);\n }\n });\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n const handleResize = (0,_utils_debounce__WEBPACK_IMPORTED_MODULE_17__[\"default\"])(() => {\n // If the Tabs component is replaced by Suspense with a fallback, the last\n // ResizeObserver's handler that runs because of the change in the layout is trying to\n // access a dom node that is no longer there (as the fallback component is being shown instead).\n // See https://github.com/mui/material-ui/issues/33276\n // TODO: Add tests that will ensure the component is not failing when\n // replaced by Suspense with a fallback, once React is updated to version 18\n if (tabsRef.current) {\n updateIndicatorState();\n }\n });\n const win = (0,_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_18__[\"default\"])(tabsRef.current);\n win.addEventListener('resize', handleResize);\n let resizeObserver;\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(handleResize);\n Array.from(tabListRef.current.children).forEach(child => {\n resizeObserver.observe(child);\n });\n }\n return () => {\n handleResize.clear();\n win.removeEventListener('resize', handleResize);\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, [updateIndicatorState]);\n\n /**\n * Toggle visibility of start and end scroll buttons\n * Using IntersectionObserver on first and last Tabs.\n */\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n const tabListChildren = Array.from(tabListRef.current.children);\n const length = tabListChildren.length;\n if (typeof IntersectionObserver !== 'undefined' && length > 0 && scrollable && scrollButtons !== false) {\n const firstTab = tabListChildren[0];\n const lastTab = tabListChildren[length - 1];\n const observerOptions = {\n root: tabsRef.current,\n threshold: 0.99\n };\n const handleScrollButtonStart = entries => {\n setDisplayStartScroll(!entries[0].isIntersecting);\n };\n const firstObserver = new IntersectionObserver(handleScrollButtonStart, observerOptions);\n firstObserver.observe(firstTab);\n const handleScrollButtonEnd = entries => {\n setDisplayEndScroll(!entries[0].isIntersecting);\n };\n const lastObserver = new IntersectionObserver(handleScrollButtonEnd, observerOptions);\n lastObserver.observe(lastTab);\n return () => {\n firstObserver.disconnect();\n lastObserver.disconnect();\n };\n }\n return undefined;\n }, [scrollable, scrollButtons, updateScrollObserver, childrenProp == null ? void 0 : childrenProp.length]);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n setMounted(true);\n }, []);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n updateIndicatorState();\n });\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n // Don't animate on the first render.\n scrollSelectedIntoView(defaultIndicatorStyle !== indicatorStyle);\n }, [scrollSelectedIntoView, indicatorStyle]);\n react__WEBPACK_IMPORTED_MODULE_2__.useImperativeHandle(action, () => ({\n updateIndicator: updateIndicatorState,\n updateScrollButtons: updateScrollButtonState\n }), [updateIndicatorState, updateScrollButtonState]);\n const indicator = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(TabsIndicator, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, TabIndicatorProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.indicator, TabIndicatorProps.className),\n ownerState: ownerState,\n style: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, indicatorStyle, TabIndicatorProps.style)\n }));\n let childIndex = 0;\n const children = react__WEBPACK_IMPORTED_MODULE_2__.Children.map(childrenProp, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.isValidElement(child)) {\n return null;\n }\n if (true) {\n if ((0,react_is__WEBPACK_IMPORTED_MODULE_3__.isFragment)(child)) {\n console.error([\"MUI: The Tabs component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n }\n }\n const childValue = child.props.value === undefined ? childIndex : child.props.value;\n valueToIndex.set(childValue, childIndex);\n const selected = childValue === value;\n childIndex += 1;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(child, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n fullWidth: variant === 'fullWidth',\n indicator: selected && !mounted && indicator,\n selected,\n selectionFollowsFocus,\n onChange,\n textColor,\n value: childValue\n }, childIndex === 1 && value === false && !child.props.tabIndex ? {\n tabIndex: 0\n } : {}));\n });\n const handleKeyDown = event => {\n const list = tabListRef.current;\n const currentFocus = (0,_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_19__[\"default\"])(list).activeElement;\n // Keyboard navigation assumes that [role=\"tab\"] are siblings\n // though we might warn in the future about nested, interactive elements\n // as a a11y violation\n const role = currentFocus.getAttribute('role');\n if (role !== 'tab') {\n return;\n }\n let previousItemKey = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n let nextItemKey = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n if (orientation === 'horizontal' && isRtl) {\n // swap previousItemKey with nextItemKey\n previousItemKey = 'ArrowRight';\n nextItemKey = 'ArrowLeft';\n }\n switch (event.key) {\n case previousItemKey:\n event.preventDefault();\n moveFocus(list, currentFocus, previousItem);\n break;\n case nextItemKey:\n event.preventDefault();\n moveFocus(list, currentFocus, nextItem);\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(list, null, nextItem);\n break;\n case 'End':\n event.preventDefault();\n moveFocus(list, null, previousItem);\n break;\n default:\n break;\n }\n };\n const conditionalElements = getConditionalElements();\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(TabsRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n ownerState: ownerState,\n ref: ref,\n as: component\n }, other, {\n children: [conditionalElements.scrollButtonStart, conditionalElements.scrollbarSizeListener, /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(TabsScroller, {\n className: classes.scroller,\n ownerState: ownerState,\n style: {\n overflow: scrollerStyle.overflow,\n [vertical ? `margin${isRtl ? 'Left' : 'Right'}` : 'marginBottom']: visibleScrollbar ? undefined : -scrollerStyle.scrollbarWidth\n },\n ref: tabsRef,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(FlexContainer, {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-orientation\": orientation === 'vertical' ? 'vertical' : null,\n className: classes.flexContainer,\n ownerState: ownerState,\n onKeyDown: handleKeyDown,\n ref: tabListRef,\n role: \"tablist\",\n children: children\n }), mounted && indicator]\n }), conditionalElements.scrollButtonEnd]\n }));\n});\n true ? Tabs.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * Callback fired when the component mounts.\n * This is useful when you want to trigger an action programmatically.\n * It supports two actions: `updateIndicator()` and `updateScrollButtons()`\n *\n * @param {object} actions This object contains all possible actions\n * that can be triggered programmatically.\n */\n action: _mui_utils__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n /**\n * If `true`, the scroll buttons aren't forced hidden on mobile.\n * By default the scroll buttons are hidden on mobile and takes precedence over `scrollButtons`.\n * @default false\n */\n allowScrollButtonsMobile: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool),\n /**\n * The label for the Tabs as a string.\n */\n 'aria-label': (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string),\n /**\n * An id or list of ids separated by a space that label the Tabs.\n */\n 'aria-labelledby': (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string),\n /**\n * If `true`, the tabs are centered.\n * This prop is intended for large views.\n * @default false\n */\n centered: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool),\n /**\n * The content of the component.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().node),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string),\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType),\n /**\n * Determines the color of the indicator.\n * @default 'primary'\n */\n indicatorColor: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['primary', 'secondary']), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().string)]),\n /**\n * Callback fired when the value changes.\n *\n * @param {React.SyntheticEvent} event The event source of the callback. **Warning**: This is a generic event not a change event.\n * @param {any} value We default to the index of the child (number)\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().func),\n /**\n * The component orientation (layout flow direction).\n * @default 'horizontal'\n */\n orientation: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['horizontal', 'vertical']),\n /**\n * The component used to render the scroll buttons.\n * @default TabScrollButton\n */\n ScrollButtonComponent: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType),\n /**\n * Determine behavior of scroll buttons when tabs are set to scroll:\n *\n * - `auto` will only present them when not all the items are visible.\n * - `true` will always present them.\n * - `false` will never present them.\n *\n * By default the scroll buttons are hidden on mobile.\n * This behavior can be disabled with `allowScrollButtonsMobile`.\n * @default 'auto'\n */\n scrollButtons: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['auto', false, true]),\n /**\n * If `true` the selected tab changes on focus. Otherwise it only\n * changes on activation.\n */\n selectionFollowsFocus: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool),\n /**\n * The extra props for the slot components.\n * You can override the existing props or add new ones.\n * @default {}\n */\n slotProps: prop_types__WEBPACK_IMPORTED_MODULE_21___default().shape({\n endScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object)]),\n startScrollButtonIcon: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object)])\n }),\n /**\n * The components used for each slot inside.\n * @default {}\n */\n slots: prop_types__WEBPACK_IMPORTED_MODULE_21___default().shape({\n EndScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType),\n StartScrollButtonIcon: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().elementType)\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_21___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object)]),\n /**\n * Props applied to the tab indicator element.\n * @default {}\n */\n TabIndicatorProps: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object),\n /**\n * Props applied to the [`TabScrollButton`](/material-ui/api/tab-scroll-button/) element.\n * @default {}\n */\n TabScrollButtonProps: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().object),\n /**\n * Determines the color of the `Tab`.\n * @default 'primary'\n */\n textColor: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['inherit', 'primary', 'secondary']),\n /**\n * The value of the currently selected `Tab`.\n * If you don't want any selected `Tab`, you can set this prop to `false`.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().any),\n /**\n * Determines additional display behavior of the tabs:\n *\n * - `scrollable` will invoke scrolling properties and allow for horizontally\n * scrolling (or swiping) of the tab bar.\n * -`fullWidth` will make the tabs grow to use all the available space,\n * which should be used for small views, like on mobile.\n * - `standard` will render the default state.\n * @default 'standard'\n */\n variant: prop_types__WEBPACK_IMPORTED_MODULE_21___default().oneOf(['fullWidth', 'scrollable', 'standard']),\n /**\n * If `true`, the scrollbar is visible. It can be useful when displaying\n * a long vertical list of tabs.\n * @default false\n */\n visibleScrollbar: (prop_types__WEBPACK_IMPORTED_MODULE_21___default().bool)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tabs);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tabs/Tabs.js?"); - -/***/ }), - -/***/ "./node_modules/@mui/material/Tabs/tabsClasses.js": -/*!********************************************************!*\ - !*** ./node_modules/@mui/material/Tabs/tabsClasses.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getTabsUtilityClass: () => (/* binding */ getTabsUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getTabsUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiTabs', slot);\n}\nconst tabsClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiTabs', ['root', 'vertical', 'flexContainer', 'flexContainerVertical', 'centered', 'scroller', 'fixed', 'scrollableX', 'scrollableY', 'hideScrollbar', 'scrollButtons', 'scrollButtonsHideMobile', 'indicator']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tabsClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Tabs/tabsClasses.js?"); - -/***/ }), - /***/ "./node_modules/@mui/material/TextField/TextField.js": /*!***********************************************************!*\ !*** ./node_modules/@mui/material/TextField/TextField.js ***! @@ -1988,17 +1911,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./node_modules/@mui/material/internal/animate.js": -/*!********************************************************!*\ - !*** ./node_modules/@mui/material/internal/animate.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ animate)\n/* harmony export */ });\nfunction easeInOutSin(time) {\n return (1 + Math.sin(Math.PI * time - Math.PI / 2)) / 2;\n}\nfunction animate(property, element, to, options = {}, cb = () => {}) {\n const {\n ease = easeInOutSin,\n duration = 300 // standard\n } = options;\n let start = null;\n const from = element[property];\n let cancelled = false;\n const cancel = () => {\n cancelled = true;\n };\n const step = timestamp => {\n if (cancelled) {\n cb(new Error('Animation cancelled'));\n return;\n }\n if (start === null) {\n start = timestamp;\n }\n const time = Math.min(1, (timestamp - start) / duration);\n element[property] = ease(time) * (to - from) + from;\n if (time >= 1) {\n requestAnimationFrame(() => {\n cb(null);\n });\n return;\n }\n requestAnimationFrame(step);\n };\n if (from === to) {\n cb(new Error('Element already at target position'));\n return cancel;\n }\n requestAnimationFrame(step);\n return cancel;\n}\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/animate.js?"); - -/***/ }), - /***/ "./node_modules/@mui/material/internal/svg-icons/ArrowDropDown.js": /*!************************************************************************!*\ !*** ./node_modules/@mui/material/internal/svg-icons/ArrowDropDown.js ***! @@ -2021,28 +1933,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js": -/*!****************************************************************************!*\ - !*** ./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"\n}), 'KeyboardArrowLeft'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/KeyboardArrowLeft.js?"); - -/***/ }), - -/***/ "./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js ***! - \*****************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"\n}), 'KeyboardArrowRight'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/KeyboardArrowRight.js?"); - -/***/ }), - /***/ "./node_modules/@mui/material/node_modules/react-is/cjs/react-is.development.js": /*!**************************************************************************************!*\ !*** ./node_modules/@mui/material/node_modules/react-is/cjs/react-is.development.js ***! @@ -2989,17 +2879,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./node_modules/@mui/utils/esm/scrollLeft.js": -/*!***************************************************!*\ - !*** ./node_modules/@mui/utils/esm/scrollLeft.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ detectScrollType: () => (/* binding */ detectScrollType),\n/* harmony export */ getNormalizedScrollLeft: () => (/* binding */ getNormalizedScrollLeft)\n/* harmony export */ });\n// Source from https://github.com/alitaheri/normalize-scroll-left\nlet cachedType;\n\n/**\n * Based on the jquery plugin https://github.com/othree/jquery.rtl-scroll-type\n *\n * Types of scrollLeft, assuming scrollWidth=100 and direction is rtl.\n *\n * Type | <- Most Left | Most Right -> | Initial\n * ---------------- | ------------ | ------------- | -------\n * default | 0 | 100 | 100\n * negative (spec*) | -100 | 0 | 0\n * reverse | 100 | 0 | 0\n *\n * Edge 85: default\n * Safari 14: negative\n * Chrome 85: negative\n * Firefox 81: negative\n * IE11: reverse\n *\n * spec* https://drafts.csswg.org/cssom-view/#dom-window-scroll\n */\nfunction detectScrollType() {\n if (cachedType) {\n return cachedType;\n }\n const dummy = document.createElement('div');\n const container = document.createElement('div');\n container.style.width = '10px';\n container.style.height = '1px';\n dummy.appendChild(container);\n dummy.dir = 'rtl';\n dummy.style.fontSize = '14px';\n dummy.style.width = '4px';\n dummy.style.height = '1px';\n dummy.style.position = 'absolute';\n dummy.style.top = '-1000px';\n dummy.style.overflow = 'scroll';\n document.body.appendChild(dummy);\n cachedType = 'reverse';\n if (dummy.scrollLeft > 0) {\n cachedType = 'default';\n } else {\n dummy.scrollLeft = 1;\n if (dummy.scrollLeft === 0) {\n cachedType = 'negative';\n }\n }\n document.body.removeChild(dummy);\n return cachedType;\n}\n\n// Based on https://stackoverflow.com/a/24394376\nfunction getNormalizedScrollLeft(element, direction) {\n const scrollLeft = element.scrollLeft;\n\n // Perform the calculations only when direction is rtl to avoid messing up the ltr behavior\n if (direction !== 'rtl') {\n return scrollLeft;\n }\n const type = detectScrollType();\n switch (type) {\n case 'negative':\n return element.scrollWidth - element.clientWidth + scrollLeft;\n case 'reverse':\n return element.scrollWidth - element.clientWidth - scrollLeft;\n default:\n return scrollLeft;\n }\n}\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/utils/esm/scrollLeft.js?"); - -/***/ }), - /***/ "./node_modules/@mui/utils/esm/setRef.js": /*!***********************************************!*\ !*** ./node_modules/@mui/utils/esm/setRef.js ***! @@ -3161,7 +3040,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ App: () => (/* binding */ App)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_app_error_page */ \"./app/components/p8p_app_error_page.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config_wrapper */ \"./app/config_wrapper.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Приложение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Роутер\n //Контекст приложения\n //Контекст навигации\n //Страница с ошибкой\n //Рабочее пространство панели\n //Меню панелей\n //Текстовые ресурсы и константы\n //Подключение компонентов к настройкам приложения\n\n//--------------------------\n//Вспомогательные компоненты\n//--------------------------\n\n//Обработка ошибок роутинга\nconst RouterError = ({\n homePath\n}) => {\n //Подключение к контексту навигации\n const {\n navigateTo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Извлечем ошибку роутинга\n const routeError = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useRouteError)();\n\n //Отработка нажатия на кнопку навигации\n const handleNavigate = () => navigateTo({\n path: `${homePath.startsWith(\"/\") ? \"\" : \"/\"}${homePath}`\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__.P8PAppErrorPage, {\n errorMessage: _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] ? _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] : _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS.DEFAULT,\n onNavigate: handleNavigate,\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_6__.BUTTONS.NAVIGATE_HOME\n });\n};\n\n//Контроль свойств - обработка ошибок роутинга\nRouterError.propTypes = {\n homePath: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired\n};\n\n//Главное меню приложения\nconst MainMenu = ({\n panels = []\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigatePanel,\n isNavigationSearch,\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Подключение к контексту приложения\n const {\n configUrlBase,\n pOnlineShowTab\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Получим параметры запроса из адресной строки\n const qS = isNavigationSearch() ? getNavigationSearch() : null;\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = (panel, newTab) => newTab ? pOnlineShowTab({\n id: panel.name,\n url: `${configUrlBase}${panel.url}`,\n caption: panel.caption\n }) : navigatePanel(panel);\n\n //Генерация содержимого\n return qS?.mode === \"DESKTOP\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuDesktop, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n group: qS?.group,\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, true)\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, false)\n }));\n};\n\n//Контроль свойств - главное меню приложения\nMainMenu.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired\n};\n\n//Рабочее пространство панели\nconst Workspace = ({\n panels = [],\n selectedPanel,\n children\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigateRoot,\n navigatePanel\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Отработка действия навигации домой\n const handleHomeNavigate = () => navigateRoot();\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = panel => navigatePanel(panel);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_APP_WORKSPACE_CONFIG_PROPS, {\n panels: panels,\n selectedPanel: selectedPanel,\n onHomeNavigate: handleHomeNavigate,\n onItemNavigate: handleItemNavigate\n }), children);\n};\n\n//Контроль свойств - главное меню приложения\nWorkspace.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE,\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//Обёртывание элемента в контекст навигации\nconst wrapNavigationContext = children => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationContext, null, children);\n\n//-----------\n//Тело модуля\n//-----------\n\n//Приложение\nconst App = () => {\n //Собственное состояние\n const [routes, setRoutes] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Подключение к контексту приложения\n const {\n appState\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Инициализация роутера\n const content = routes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_8__.RouterProvider, {\n router: (0,react_router_dom__WEBPACK_IMPORTED_MODULE_10__.createHashRouter)(routes)\n }) : null;\n\n //При изменении состояния загрузки панелей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (appState.panelsLoaded) {\n //Сборка \"веток\" для панелей\n let routes = [{\n path: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)(),\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenu, {\n panels: appState.panels\n })),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)()\n }))\n }];\n for (const panel of appState.panels) {\n // eslint-disable-next-line no-undef\n const p = __webpack_require__(\"./app/panels sync recursive ^\\\\.\\\\/.*$\")(`./${panel.path}`);\n routes.push({\n path: `${panel.url}/*`,\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Workspace, {\n panels: appState.panels,\n selectedPanel: panel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(p.RootClass, null))),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: panel.url\n }))\n });\n }\n setRoutes(routes);\n }\n }, [appState.panels, appState.panelsLoaded]);\n\n //Генерация содержимого\n return content;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/app.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ App: () => (/* binding */ App)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_app_error_page */ \"./app/components/p8p_app_error_page.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./config_wrapper */ \"./app/config_wrapper.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Роутер\n //Контекст приложения\n //Контекст навигации\n //Страница с ошибкой\n //Рабочее пространство панели\n //Меню панелей\n //Текстовые ресурсы и константы\n //Подключение компонентов к настройкам приложения\n\n//--------------------------\n//Вспомогательные компоненты\n//--------------------------\n\n//Обработка ошибок роутинга\nconst RouterError = ({\n homePath\n}) => {\n //Подключение к контексту навигации\n const {\n navigateTo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Извлечем ошибку роутинга\n const routeError = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_8__.useRouteError)();\n\n //Отработка нажатия на кнопку навигации\n const handleNavigate = () => navigateTo({\n path: `${homePath.startsWith(\"/\") ? \"\" : \"/\"}${homePath}`\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_error_page__WEBPACK_IMPORTED_MODULE_3__.P8PAppErrorPage, {\n errorMessage: _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] ? _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS_HTTP[routeError.status] : _app_text__WEBPACK_IMPORTED_MODULE_6__.ERRORS.DEFAULT,\n onNavigate: handleNavigate,\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_6__.BUTTONS.NAVIGATE_HOME\n });\n};\n\n//Контроль свойств - обработка ошибок роутинга\nRouterError.propTypes = {\n homePath: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired\n};\n\n//Главное меню приложения\nconst MainMenu = ({\n panels = []\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigatePanel,\n isNavigationSearch,\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Подключение к контексту приложения\n const {\n configUrlBase,\n pOnlineShowTab\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Получим параметры запроса из адресной строки\n const qS = isNavigationSearch() ? getNavigationSearch() : null;\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = (panel, newTab) => newTab ? pOnlineShowTab({\n id: panel.name,\n url: `${configUrlBase}${panel.url}`,\n caption: panel.caption\n }) : navigatePanel(panel);\n\n //Генерация содержимого\n return qS?.mode === \"DESKTOP\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuDesktop, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n group: qS?.group,\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, true)\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8PPanelsMenuGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_PANELS_MENU_GRID_CONFIG_PROPS, {\n panels: panels,\n onItemNavigate: panel => handleItemNavigate(panel, false)\n }));\n};\n\n//Контроль свойств - главное меню приложения\nMainMenu.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired\n};\n\n//Рабочее пространство панели\nconst Workspace = ({\n panels = [],\n selectedPanel,\n children\n} = {}) => {\n //Подключение к контексту навигации\n const {\n navigateRoot,\n navigatePanel\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //Отработка действия навигации домой\n const handleHomeNavigate = () => navigateRoot();\n\n //Отработка действия навигации элемента меню\n const handleItemNavigate = panel => navigatePanel(panel);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_APP_WORKSPACE_CONFIG_PROPS, {\n panels: panels,\n selectedPanel: selectedPanel,\n onHomeNavigate: handleHomeNavigate,\n onItemNavigate: handleItemNavigate\n }), children);\n};\n\n//Контроль свойств - главное меню приложения\nWorkspace.propTypes = {\n panels: prop_types__WEBPACK_IMPORTED_MODULE_9___default().arrayOf(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_5__.P8P_PANELS_MENU_PANEL_SHAPE,\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//Обёртывание элемента в контекст навигации\nconst wrapNavigationContext = children => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationContext, null, children);\n\n//-----------\n//Тело модуля\n//-----------\n\n//Приложение\nconst App = () => {\n //Собственное состояние\n const [routes, setRoutes] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Подключение к контексту приложения\n const {\n appState\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Инициализация роутера\n const content = routes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_8__.RouterProvider, {\n router: (0,react_router_dom__WEBPACK_IMPORTED_MODULE_10__.createHashRouter)(routes)\n }) : null;\n\n //При изменении состояния загрузки панелей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (appState.panelsLoaded) {\n //Сборка \"веток\" для панелей\n let routes = [{\n path: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)(),\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MainMenu, {\n panels: appState.panels\n })),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: (0,_context_navigation__WEBPACK_IMPORTED_MODULE_2__.getRootLocation)()\n }))\n }];\n for (const panel of appState.panels) {\n // eslint-disable-next-line no-undef\n const p = __webpack_require__(\"./app/panels sync recursive ^\\\\.\\\\/.*$\")(`./${panel.path}`);\n routes.push({\n path: `${panel.url}/*`,\n element: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Workspace, {\n panels: appState.panels,\n selectedPanel: panel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(p.RootClass, null))),\n errorElement: wrapNavigationContext( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(RouterError, {\n homePath: panel.url\n }))\n });\n }\n setRoutes(routes);\n }\n }, [appState.panels, appState.panelsLoaded]);\n\n //Генерация содержимого\n return content;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/app.js?"); /***/ }), @@ -3172,7 +3051,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppErrorPage: () => (/* binding */ P8PAppErrorPage)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Страница ошибки\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Контейнер\n //Сообщения\n\n//-----------\n//Тело модуля\n//-----------\n\n//Страница ошибки\nconst P8PAppErrorPage = ({\n errorMessage,\n onNavigate,\n navigateCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: errorMessage,\n okBtn: onNavigate ? true : false,\n onOk: onNavigate,\n okBtnCaption: navigateCaption\n })));\n};\n\n//Контроль свойств - Страница ошибки\nP8PAppErrorPage.propTypes = {\n errorMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_error_page.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppErrorPage: () => (/* binding */ P8PAppErrorPage)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Страница ошибки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Контейнер\n //Сообщения\n\n//-----------\n//Тело модуля\n//-----------\n\n//Страница ошибки\nconst P8PAppErrorPage = ({\n errorMessage,\n onNavigate,\n navigateCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: errorMessage,\n okBtn: onNavigate ? true : false,\n onOk: onNavigate,\n okBtnCaption: navigateCaption\n })));\n};\n\n//Контроль свойств - Страница ошибки\nP8PAppErrorPage.propTypes = {\n errorMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_error_page.js?"); /***/ }), @@ -3183,7 +3062,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppInlineError: () => (/* binding */ P8PAppInlineError),\n/* harmony export */ P8PAppInlineInfo: () => (/* binding */ P8PAppInlineInfo),\n/* harmony export */ P8PAppInlineMessage: () => (/* binding */ P8PAppInlineMessage),\n/* harmony export */ P8PAppInlineWarn: () => (/* binding */ P8PAppInlineWarn),\n/* harmony export */ P8PAppMessage: () => (/* binding */ P8PAppMessage),\n/* harmony export */ P8PAppMessageErr: () => (/* binding */ P8PAppMessageErr),\n/* harmony export */ P8PAppMessageInfo: () => (/* binding */ P8PAppMessageInfo),\n/* harmony export */ P8PAppMessageWarn: () => (/* binding */ P8PAppMessageWarn),\n/* harmony export */ P8P_APP_MESSAGE_VARIANT: () => (/* binding */ P8P_APP_MESSAGE_VARIANT)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogActions */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material/Typography */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/Button */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material_Container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material/Container */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material/Box */ \"./node_modules/@mui/material/Box/Box.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Компонент: Сообщение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Область действий диалога\n //Текст\n //Кнопки\n //Контейнер\n //Обёртка\n\n//---------\n//Константы\n//---------\n\n//Варианты исполнения\nconst P8P_APP_MESSAGE_VARIANT = {\n INFO: \"information\",\n WARN: \"warning\",\n ERR: \"error\"\n};\n\n//Стили\nconst STYLES = {\n DEFAULT: {\n wordBreak: \"break-word\"\n },\n INFO: {\n titleText: {},\n bodyText: {}\n },\n WARN: {\n titleText: {\n color: \"orange\"\n },\n bodyText: {\n color: \"orange\"\n }\n },\n ERR: {\n titleText: {\n color: \"red\"\n },\n bodyText: {\n color: \"red\"\n }\n },\n INLINE_MESSAGE: {\n with: \"100%\",\n textAlign: \"center\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Сообщение\nconst P8PAppMessage = ({\n variant,\n title,\n titleText,\n cancelBtn,\n onCancel,\n cancelBtnCaption,\n okBtn,\n onOk,\n okBtnCaption,\n open,\n text\n}) => {\n //Подбор стиля и ресурсов\n let style = STYLES.INFO;\n switch (variant) {\n case P8P_APP_MESSAGE_VARIANT.INFO:\n {\n style = STYLES.INFO;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.WARN:\n {\n style = STYLES.WARN;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.ERR:\n {\n style = STYLES.ERR;\n break;\n }\n }\n\n //Заголовок\n let titlePart;\n if (title && titleText) titlePart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: \"message-dialog-title\",\n style: {\n ...style.DEFAULT,\n ...style.titleText\n }\n }, titleText);\n\n //Кнопка Отмена\n let cancelBtnPart;\n if (cancelBtn && cancelBtnCaption && variant === P8P_APP_MESSAGE_VARIANT.WARN) cancelBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, cancelBtnCaption);\n\n //Кнопка OK\n let okBtnPart;\n if (okBtn && okBtnCaption) okBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption);\n\n //Все действия\n let actionsPart;\n if (cancelBtnPart || okBtnPart) actionsPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, okBtnPart, cancelBtnPart);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"message-dialog-title\",\n \"aria-describedby\": \"message-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, titlePart, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n id: \"message-dialog-description\",\n style: style.bodyText\n }, text)), actionsPart);\n};\n\n//Контроль свойств - Сообщение\nP8PAppMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n titleText: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n cancelBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n open: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Встроенное сообщение\nconst P8PAppInlineMessage = ({\n variant,\n text,\n okBtn,\n onOk,\n okBtnCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n style: STYLES.INLINE_MESSAGE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: variant === P8P_APP_MESSAGE_VARIANT.ERR ? \"error\" : variant === P8P_APP_MESSAGE_VARIANT.WARN ? \"primary\" : \"textSecondary\"\n }, text), okBtn && okBtnCaption ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption)) : null));\n};\n\n//Контроль свойств - Встроенное сообщение\nP8PAppInlineMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Формирование типового сообщения\nconst buildVariantMessage = (props, variant) => {\n //Извлекаем необходимые свойства\n let {\n open,\n titleText\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppMessage, _extends({}, props, {\n variant: variant,\n open: open === undefined ? true : open,\n title: titleText ? true : false,\n okBtn: true\n }));\n};\n\n//Формирование типового встроенного сообщения\nconst buildVariantInlineMessage = (props, variant) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppInlineMessage, _extends({}, props, {\n variant: variant\n }));\n};\n\n//Сообщение об ошибке\nconst P8PAppMessageErr = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Сообщение предупреждения\nconst P8PAppMessageWarn = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Сообщение информации\nconst P8PAppMessageInfo = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//Встраиваемое сообщение об ошибке\nconst P8PAppInlineError = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Встраиваемое cообщение предупреждения\nconst P8PAppInlineWarn = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Встраиваемое сообщение информации\nconst P8PAppInlineInfo = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_message.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppInlineError: () => (/* binding */ P8PAppInlineError),\n/* harmony export */ P8PAppInlineInfo: () => (/* binding */ P8PAppInlineInfo),\n/* harmony export */ P8PAppInlineMessage: () => (/* binding */ P8PAppInlineMessage),\n/* harmony export */ P8PAppInlineWarn: () => (/* binding */ P8PAppInlineWarn),\n/* harmony export */ P8PAppMessage: () => (/* binding */ P8PAppMessage),\n/* harmony export */ P8PAppMessageErr: () => (/* binding */ P8PAppMessageErr),\n/* harmony export */ P8PAppMessageInfo: () => (/* binding */ P8PAppMessageInfo),\n/* harmony export */ P8PAppMessageWarn: () => (/* binding */ P8PAppMessageWarn),\n/* harmony export */ P8P_APP_MESSAGE_VARIANT: () => (/* binding */ P8P_APP_MESSAGE_VARIANT)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogActions */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material/Typography */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/Button */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material_Container__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material/Container */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material/Box */ \"./node_modules/@mui/material/Box/Box.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Сообщение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Область действий диалога\n //Текст\n //Кнопки\n //Контейнер\n //Обёртка\n\n//---------\n//Константы\n//---------\n\n//Варианты исполнения\nconst P8P_APP_MESSAGE_VARIANT = {\n INFO: \"information\",\n WARN: \"warning\",\n ERR: \"error\"\n};\n\n//Стили\nconst STYLES = {\n DEFAULT: {\n wordBreak: \"break-word\"\n },\n INFO: {\n titleText: {},\n bodyText: {}\n },\n WARN: {\n titleText: {\n color: \"orange\"\n },\n bodyText: {\n color: \"orange\"\n }\n },\n ERR: {\n titleText: {\n color: \"red\"\n },\n bodyText: {\n color: \"red\"\n }\n },\n INLINE_MESSAGE: {\n with: \"100%\",\n textAlign: \"center\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Сообщение\nconst P8PAppMessage = ({\n variant,\n title,\n titleText,\n cancelBtn,\n onCancel,\n cancelBtnCaption,\n okBtn,\n onOk,\n okBtnCaption,\n open,\n text\n}) => {\n //Подбор стиля и ресурсов\n let style = STYLES.INFO;\n switch (variant) {\n case P8P_APP_MESSAGE_VARIANT.INFO:\n {\n style = STYLES.INFO;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.WARN:\n {\n style = STYLES.WARN;\n break;\n }\n case P8P_APP_MESSAGE_VARIANT.ERR:\n {\n style = STYLES.ERR;\n break;\n }\n }\n\n //Заголовок\n let titlePart;\n if (title && titleText) titlePart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: \"message-dialog-title\",\n style: {\n ...style.DEFAULT,\n ...style.titleText\n }\n }, titleText);\n\n //Кнопка Отмена\n let cancelBtnPart;\n if (cancelBtn && cancelBtnCaption && variant === P8P_APP_MESSAGE_VARIANT.WARN) cancelBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, cancelBtnCaption);\n\n //Кнопка OK\n let okBtnPart;\n if (okBtn && okBtnCaption) okBtnPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption);\n\n //Все действия\n let actionsPart;\n if (cancelBtnPart || okBtnPart) actionsPart = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogActions__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, okBtnPart, cancelBtnPart);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"message-dialog-title\",\n \"aria-describedby\": \"message-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, titlePart, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n id: \"message-dialog-description\",\n style: style.bodyText\n }, text)), actionsPart);\n};\n\n//Контроль свойств - Сообщение\nP8PAppMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n titleText: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n cancelBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string),\n open: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Встроенное сообщение\nconst P8PAppInlineMessage = ({\n variant,\n text,\n okBtn,\n onOk,\n okBtnCaption\n}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Container__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n style: STYLES.INLINE_MESSAGE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n color: variant === P8P_APP_MESSAGE_VARIANT.ERR ? \"error\" : variant === P8P_APP_MESSAGE_VARIANT.WARN ? \"primary\" : \"textSecondary\"\n }, text), okBtn && okBtnCaption ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n onClick: () => onOk ? onOk() : null,\n color: \"primary\",\n autoFocus: true\n }, okBtnCaption)) : null));\n};\n\n//Контроль свойств - Встроенное сообщение\nP8PAppInlineMessage.propTypes = {\n variant: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n text: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired,\n okBtn: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().bool),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func),\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n};\n\n//Формирование типового сообщения\nconst buildVariantMessage = (props, variant) => {\n //Извлекаем необходимые свойства\n let {\n open,\n titleText\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppMessage, _extends({}, props, {\n variant: variant,\n open: open === undefined ? true : open,\n title: titleText ? true : false,\n okBtn: true\n }));\n};\n\n//Формирование типового встроенного сообщения\nconst buildVariantInlineMessage = (props, variant) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PAppInlineMessage, _extends({}, props, {\n variant: variant\n }));\n};\n\n//Сообщение об ошибке\nconst P8PAppMessageErr = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Сообщение предупреждения\nconst P8PAppMessageWarn = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Сообщение информации\nconst P8PAppMessageInfo = props => buildVariantMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//Встраиваемое сообщение об ошибке\nconst P8PAppInlineError = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.ERR);\n\n//Встраиваемое cообщение предупреждения\nconst P8PAppInlineWarn = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.WARN);\n\n//Встраиваемое сообщение информации\nconst P8PAppInlineInfo = props => buildVariantInlineMessage(props, P8P_APP_MESSAGE_VARIANT.INFO);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_message.js?"); /***/ }), @@ -3194,7 +3073,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppProgress: () => (/* binding */ P8PAppProgress)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/LinearProgress */ \"./node_modules/@mui/material/LinearProgress/LinearProgress.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Индикатор процесса\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Индикатор\n\n//-----------\n//Тело модуля\n//-----------\n\n//Индикатора прогресса\nconst P8PAppProgress = props => {\n //Извлекаем необходимые свойства\n let {\n open,\n title,\n text\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"progress-dialog-title\",\n \"aria-describedby\": \"progress-dialog-description\"\n }, title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: \"progress-dialog-title\"\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: \"progress-dialog-description\"\n }, text), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null))));\n};\n\n//Контроль свойств - Индикатора прогресса\nP8PAppProgress.propTypes = {\n open: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_progress.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppProgress: () => (/* binding */ P8PAppProgress)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material/Dialog */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material/DialogTitle */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/DialogContent */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material/DialogContentText */ \"./node_modules/@mui/material/DialogContentText/DialogContentText.js\");\n/* harmony import */ var _mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material/LinearProgress */ \"./node_modules/@mui/material/LinearProgress/LinearProgress.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Индикатор процесса\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //базовый класс диалога Material UI\n //Заголовок диалога\n //Содержимое диалога\n //Текст содержимого диалога\n //Индикатор\n\n//-----------\n//Тело модуля\n//-----------\n\n//Индикатора прогресса\nconst P8PAppProgress = props => {\n //Извлекаем необходимые свойства\n let {\n open,\n title,\n text\n } = props;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Dialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n open: open || false,\n \"aria-labelledby\": \"progress-dialog-title\",\n \"aria-describedby\": \"progress-dialog-description\"\n }, title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogTitle__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: \"progress-dialog-title\"\n }, title) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_DialogContentText__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: \"progress-dialog-description\"\n }, text), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_LinearProgress__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null))));\n};\n\n//Контроль свойств - Индикатора прогресса\nP8PAppProgress.propTypes = {\n open: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string),\n text: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_progress.js?"); /***/ }), @@ -3205,7 +3084,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppWorkspace: () => (/* binding */ P8PAppWorkspace)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CssBaseline/CssBaseline.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Рабочее пространство\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n ROOT_BOX: {\n display: \"flex\"\n },\n APP_BAR: {\n position: \"fixed\"\n },\n APP_BAR_BUTTON: {\n mr: 2\n },\n MAIN: {\n flexGrow: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Рабочее пространство\nconst P8PAppWorkspace = ({\n children,\n panels = [],\n selectedPanel,\n closeCaption,\n homeCaption,\n onHomeNavigate,\n onItemNavigate\n} = {}) => {\n //Собственное состояния\n const [open, setOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Отработка открытия бокового меню\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n //Отработка закрытия бового меню\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n //Отработка нажатия на домашнюю страницу\n const handleHomeClick = () => onHomeNavigate ? onHomeNavigate() : null;\n\n //Отработка нажатия на элемент бокового меню\n const handleItemNavigate = panel => {\n handleDrawerClose();\n onItemNavigate ? onItemNavigate(panel) : null;\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.ROOT_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n color: \"inherit\",\n \"aria-label\": \"open drawer\",\n onClick: open ? handleDrawerClose : handleDrawerOpen,\n edge: \"start\",\n sx: STYLES.APP_BAR_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, open ? \"chevron_left\" : \"menu\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\",\n noWrap: true,\n component: \"div\"\n }, selectedPanel?.caption))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n anchor: \"left\",\n open: open,\n onClose: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: closeCaption\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleHomeClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"home\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: homeCaption\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8PPanelsMenuDrawer, {\n panels: panels,\n selectedPanel: selectedPanel,\n onItemNavigate: handleItemNavigate\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"main\", {\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), children));\n};\n\n//Контроль свойств - Рабочее пространство\nP8PAppWorkspace.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().element),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE,\n closeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n homeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n onHomeNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_workspace.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PAppWorkspace: () => (/* binding */ P8PAppWorkspace)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CssBaseline/CssBaseline.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Рабочее пространство\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n ROOT_BOX: {\n display: \"flex\"\n },\n APP_BAR: {\n position: \"fixed\"\n },\n APP_BAR_BUTTON: {\n mr: 2\n },\n MAIN: {\n flexGrow: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Рабочее пространство\nconst P8PAppWorkspace = ({\n children,\n panels = [],\n selectedPanel,\n closeCaption,\n homeCaption,\n onHomeNavigate,\n onItemNavigate\n} = {}) => {\n //Собственное состояния\n const [open, setOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Отработка открытия бокового меню\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n //Отработка закрытия бового меню\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n //Отработка нажатия на домашнюю страницу\n const handleHomeClick = () => onHomeNavigate ? onHomeNavigate() : null;\n\n //Отработка нажатия на элемент бокового меню\n const handleItemNavigate = panel => {\n handleDrawerClose();\n onItemNavigate ? onItemNavigate(panel) : null;\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.ROOT_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n color: \"inherit\",\n \"aria-label\": \"open drawer\",\n onClick: open ? handleDrawerClose : handleDrawerOpen,\n edge: \"start\",\n sx: STYLES.APP_BAR_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, open ? \"chevron_left\" : \"menu\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\",\n noWrap: true,\n component: \"div\"\n }, selectedPanel?.caption))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n anchor: \"left\",\n open: open,\n onClose: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: closeCaption\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleHomeClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"home\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: homeCaption\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8PPanelsMenuDrawer, {\n panels: panels,\n selectedPanel: selectedPanel,\n onItemNavigate: handleItemNavigate\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"main\", {\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), children));\n};\n\n//Контроль свойств - Рабочее пространство\nP8PAppWorkspace.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().element),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE,\n closeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n homeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n onHomeNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_workspace.js?"); /***/ }), @@ -3216,7 +3095,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PChart: () => (/* binding */ P8PChart),\n/* harmony export */ P8P_CHART_TYPE: () => (/* binding */ P8P_CHART_TYPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js/auto */ \"./node_modules/chart.js/auto/auto.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: График\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Диаграммы и графики\n\n//---------\n//Константы\n//---------\n\n//Виды графиков\nconst P8P_CHART_TYPE = {\n BAR: \"bar\",\n LINE: \"line\",\n PIE: \"pie\",\n DOUGHNUT: \"doughnut\"\n};\n\n//Структура элемента набора данных\nconst P8P_CHART_DATASET_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n label: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n borderColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n data: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)).isRequired,\n items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)).isRequired\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//График\nconst P8PChart = ({\n type,\n title,\n legendPosition,\n options,\n labels,\n datasets,\n onClick,\n style\n}) => {\n //Ссылки на DOM\n const chartCanvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chartRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент графика\n const handleClick = e => {\n const bar = chartRef.current.getElementsAtEventForMode(e, \"nearest\", {\n intersect: true\n }, true)[0];\n if (onClick && bar) onClick({\n datasetIndex: bar.datasetIndex,\n itemIndex: bar.index,\n item: chartRef.current.data.datasets[bar.datasetIndex].items ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] : null\n });\n };\n\n //При подключении к старнице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!chartRef.current) {\n const ctx = chartCanvasRef.current.getContext(\"2d\");\n chartRef.current = new chart_js_auto__WEBPACK_IMPORTED_MODULE_1__[\"default\"](ctx, {\n type,\n data: {\n labels: [...labels],\n datasets: [...datasets]\n },\n options: {\n ...options,\n ...{\n responsive: true,\n plugins: {\n legend: {\n display: legendPosition ? true : false,\n position: legendPosition\n },\n title: {\n display: title ? true : false,\n text: title\n }\n }\n },\n onClick: handleClick\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (chartRef.current) {\n chartRef.current.data.labels = [...labels];\n chartRef.current.data.datasets = [...datasets];\n chartRef.current.update();\n }\n }, [datasets, labels]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...style\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"canvas\", {\n ref: chartCanvasRef\n }));\n};\n\n//Контроль свойств - График\nP8PChart.propTypes = {\n type: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n legendPosition: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n options: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n labels: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)).isRequired,\n datasets: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_CHART_DATASET_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n style: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_chart.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PChart: () => (/* binding */ P8PChart),\n/* harmony export */ P8P_CHART_TYPE: () => (/* binding */ P8P_CHART_TYPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js/auto */ \"./node_modules/chart.js/auto/auto.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: График\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Диаграммы и графики\n\n//---------\n//Константы\n//---------\n\n//Виды графиков\nconst P8P_CHART_TYPE = {\n BAR: \"bar\",\n LINE: \"line\",\n PIE: \"pie\",\n DOUGHNUT: \"doughnut\"\n};\n\n//Структура элемента набора данных\nconst P8P_CHART_DATASET_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n label: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n borderColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n data: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)).isRequired,\n items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)).isRequired\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//График\nconst P8PChart = ({\n type,\n title,\n legendPosition,\n options,\n labels,\n datasets,\n onClick,\n style\n}) => {\n //Ссылки на DOM\n const chartCanvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chartRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент графика\n const handleClick = e => {\n const bar = chartRef.current.getElementsAtEventForMode(e, \"nearest\", {\n intersect: true\n }, true)[0];\n if (onClick && bar) onClick({\n datasetIndex: bar.datasetIndex,\n itemIndex: bar.index,\n item: chartRef.current.data.datasets[bar.datasetIndex].items ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] : null\n });\n };\n\n //При подключении к старнице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!chartRef.current) {\n const ctx = chartCanvasRef.current.getContext(\"2d\");\n chartRef.current = new chart_js_auto__WEBPACK_IMPORTED_MODULE_1__[\"default\"](ctx, {\n type,\n data: {\n labels: [...labels],\n datasets: [...datasets]\n },\n options: {\n ...options,\n ...{\n responsive: true,\n plugins: {\n legend: {\n display: legendPosition ? true : false,\n position: legendPosition\n },\n title: {\n display: title ? true : false,\n text: title\n }\n }\n },\n onClick: handleClick\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (chartRef.current) {\n chartRef.current.data.labels = [...labels];\n chartRef.current.data.datasets = [...datasets];\n chartRef.current.update();\n }\n }, [datasets, labels]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...style\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"canvas\", {\n ref: chartCanvasRef\n }));\n};\n\n//Контроль свойств - График\nP8PChart.propTypes = {\n type: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n legendPosition: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n options: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n labels: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)).isRequired,\n datasets: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_CHART_DATASET_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n style: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_chart.js?"); /***/ }), @@ -3227,7 +3106,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PDataGrid: () => (/* binding */ P8PDataGrid),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* binding */ P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* binding */ P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* binding */ P8P_DATA_GRID_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _p8p_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_table */ \"./app/components/p8p_table.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Таблица данных\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Таблица\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_DATA_GRID_SIZE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_SIZE;\n\n//Типы данных\nconst P8P_DATA_GRID_DATA_TYPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_DATA_TYPE;\n\n//Формат фильтра\nconst P8P_DATA_GRID_FILTER_SHAPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTER_SHAPE;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица данных\nconst P8PDataGrid = ({\n columnsDef,\n filtersInitial,\n rows,\n size,\n morePages,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - сортировки\n const [orders, setOrders] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Собственное состояние - фильтры\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filtersInitial || []);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n columnName,\n direction\n }) => {\n let newOrders = objectsCopier(orders);\n const curOrder = newOrders.find(o => o.name == columnName);\n if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);\n if (direction != null && !curOrder) newOrders.push({\n name: columnName,\n direction\n });\n if (direction != null && curOrder) curOrder.direction = direction;\n setOrders(newOrders);\n if (onOrderChanged) onOrderChanged({\n orders: newOrders\n });\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n columnName,\n from,\n to\n }) => {\n let newFilters = objectsCopier(filters);\n let curFilter = newFilters.find(f => f.name == columnName);\n if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);\n if ((from != null || to != null) && !curFilter) newFilters.push({\n name: columnName,\n from,\n to\n });\n if ((from != null || to != null) && curFilter) {\n curFilter.from = from;\n curFilter.to = to;\n }\n setFilters(newFilters);\n if (onFilterChanged) onFilterChanged({\n filters: newFilters\n });\n };\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //При изменении списка установленных извне фильтров\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setFilters(filtersInitial || []);\n }, [filtersInitial]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8PTable, {\n columnsDef: columnsDef,\n rows: rows,\n orders: orders,\n filters: filters,\n size: size || P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: morePages,\n reloading: reloading,\n expandable: expandable,\n orderAscMenuItemCaption: orderAscMenuItemCaption,\n orderDescMenuItemCaption: orderDescMenuItemCaption,\n filterMenuItemCaption: filterMenuItemCaption,\n valueFilterCaption: valueFilterCaption,\n valueFromFilterCaption: valueFromFilterCaption,\n valueToFilterCaption: valueToFilterCaption,\n okFilterBtnCaption: okFilterBtnCaption,\n clearFilterBtnCaption: clearFilterBtnCaption,\n cancelFilterBtnCaption: cancelFilterBtnCaption,\n morePagesBtnCaption: morePagesBtnCaption,\n noDataFoundText: noDataFoundText,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n rowExpandRender: rowExpandRender,\n valueFormatter: valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n });\n};\n\n//Контроль свойств - Таблица данных\nP8PDataGrid.propTypes = {\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filtersInitial: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_DATA_GRID_FILTER_SHAPE),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PDataGrid: () => (/* binding */ P8PDataGrid),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* binding */ P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* binding */ P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* binding */ P8P_DATA_GRID_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _p8p_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_table */ \"./app/components/p8p_table.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица данных\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Таблица\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_DATA_GRID_SIZE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_SIZE;\n\n//Типы данных\nconst P8P_DATA_GRID_DATA_TYPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_DATA_TYPE;\n\n//Формат фильтра\nconst P8P_DATA_GRID_FILTER_SHAPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTER_SHAPE;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица данных\nconst P8PDataGrid = ({\n columnsDef,\n filtersInitial,\n groups,\n rows,\n size,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - сортировки\n const [orders, setOrders] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Собственное состояние - фильтры\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filtersInitial || []);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n columnName,\n direction\n }) => {\n let newOrders = objectsCopier(orders);\n const curOrder = newOrders.find(o => o.name == columnName);\n if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);\n if (direction != null && !curOrder) newOrders.push({\n name: columnName,\n direction\n });\n if (direction != null && curOrder) curOrder.direction = direction;\n setOrders(newOrders);\n if (onOrderChanged) onOrderChanged({\n orders: newOrders\n });\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n columnName,\n from,\n to\n }) => {\n let newFilters = objectsCopier(filters);\n let curFilter = newFilters.find(f => f.name == columnName);\n if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);\n if ((from != null || to != null) && !curFilter) newFilters.push({\n name: columnName,\n from,\n to\n });\n if ((from != null || to != null) && curFilter) {\n curFilter.from = from;\n curFilter.to = to;\n }\n setFilters(newFilters);\n if (onFilterChanged) onFilterChanged({\n filters: newFilters\n });\n };\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //При изменении списка установленных извне фильтров\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setFilters(filtersInitial || []);\n }, [filtersInitial]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8PTable, {\n columnsDef: columnsDef,\n groups: groups,\n rows: rows,\n orders: orders,\n filters: filters,\n size: size || P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: morePages,\n reloading: reloading,\n expandable: expandable,\n orderAscMenuItemCaption: orderAscMenuItemCaption,\n orderDescMenuItemCaption: orderDescMenuItemCaption,\n filterMenuItemCaption: filterMenuItemCaption,\n valueFilterCaption: valueFilterCaption,\n valueFromFilterCaption: valueFromFilterCaption,\n valueToFilterCaption: valueToFilterCaption,\n okFilterBtnCaption: okFilterBtnCaption,\n clearFilterBtnCaption: clearFilterBtnCaption,\n cancelFilterBtnCaption: cancelFilterBtnCaption,\n morePagesBtnCaption: morePagesBtnCaption,\n noDataFoundText: noDataFoundText,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n rowExpandRender: rowExpandRender,\n valueFormatter: valueFormatter,\n objectsCopier: objectsCopier,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n });\n};\n\n//Контроль свойств - Таблица данных\nP8PDataGrid.propTypes = {\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filtersInitial: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_DATA_GRID_FILTER_SHAPE),\n groups: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_data_grid.js?"); /***/ }), @@ -3238,7 +3117,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PFullScreenDialog: () => (/* binding */ P8PFullScreenDialog)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Полноэкранный диалог\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DIALOG_TITLE: {\n padding: 0\n },\n APP_BAR: {\n position: \"relative\"\n },\n TITLE_TYPOGRAPHY: {\n ml: 2,\n flex: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Полноэкранный диалог\nconst P8PFullScreenDialog = ({\n title,\n onClose,\n children\n}) => {\n const handleClose = () => {\n onClose ? onClose() : null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n fullScreen: true,\n open: true,\n onClose: handleClose,\n scroll: \"paper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.DIALOG_TITLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n edge: \"start\",\n color: \"inherit\",\n onClick: handleClose,\n \"aria-label\": \"close\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE_TYPOGRAPHY,\n variant: \"h6\",\n component: \"div\"\n }, title)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, children));\n};\n\n//Контроль свойств - Полноэкранный диалог\nP8PFullScreenDialog.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_fullscreen_dialog.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PFullScreenDialog: () => (/* binding */ P8PFullScreenDialog)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Полноэкранный диалог\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DIALOG_TITLE: {\n padding: 0\n },\n APP_BAR: {\n position: \"relative\"\n },\n TITLE_TYPOGRAPHY: {\n ml: 2,\n flex: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Полноэкранный диалог\nconst P8PFullScreenDialog = ({\n title,\n onClose,\n children\n}) => {\n const handleClose = () => {\n onClose ? onClose() : null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n fullScreen: true,\n open: true,\n onClose: handleClose,\n scroll: \"paper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.DIALOG_TITLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n edge: \"start\",\n color: \"inherit\",\n onClick: handleClose,\n \"aria-label\": \"close\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE_TYPOGRAPHY,\n variant: \"h6\",\n component: \"div\"\n }, title)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, children));\n};\n\n//Контроль свойств - Полноэкранный диалог\nP8PFullScreenDialog.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_fullscreen_dialog.js?"); /***/ }), @@ -3249,7 +3128,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PGantt: () => (/* binding */ P8PGantt),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* binding */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* binding */ P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* binding */ P8P_GANTT_TASK_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Slider/Slider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Диаграмма Ганта\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_GANTT_ZOOM = [0, 1, 2, 3, 4];\n\n//Уровни масштаба (строковые наименования в терминах библиотеки)\nconst P8P_GANTT_ZOOM_VIEW_MODES = {\n 0: \"Quarter Day\",\n 1: \"Half Day\",\n 2: \"Day\",\n 3: \"Week\",\n 4: \"Month\"\n};\n\n//Структура задачи\nconst P8P_GANTT_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number).isRequired,\n numb: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n dependencies: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_GANTT_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Структура описания цвета задачи\nconst P8P_GANTT_TASK_COLOR_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n numbCaption,\n nameCaption,\n startCaption,\n endCaption,\n progressCaption,\n legendCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end,\n progress: task.progress\n });\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk({\n task,\n start: state.start,\n end: state.end,\n progress: state.progress\n }) : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //При изменении сроков\n const handlePeriodChanged = e => setState(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //При изменении прогресса\n const handleProgressChanged = (e, newValue) => setState(prev => ({\n ...prev,\n progress: newValue\n }));\n\n //Описание легенды для задачи\n let legend = null;\n if (Array.isArray(taskColors)) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) legend = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: {\n ...(colorDesc.bgProgressColor ? {\n background: `linear-gradient(to right, ${colorDesc.bgProgressColor} ,${colorDesc.bgColor ? colorDesc.bgColor : \"transparent\"})}`\n } : colorDesc.bgColor ? {\n backgroundColor: colorDesc.bgColor\n } : {}),\n ...(colorDesc.textColor ? {\n color: colorDesc.textColor\n } : {})\n }\n },\n primary: legendCaption,\n secondary: colorDesc.desc\n });\n }\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: numbCaption,\n secondary: task.numb\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: startCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.start,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.start,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: endCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.end,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.end,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), hasValue(task.progress) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: `${progressCaption}${task.readOnly === true || task.readOnlyProgress === true ? ` (${task.progress}%)` : \"\"}`,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n disabled: task.readOnly === true || task.readOnlyProgress === true,\n defaultValue: task.progress,\n valueLabelDisplay: \"auto\",\n onChange: handleProgressChanged\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, legend ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, legend), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => hasValue(task[attr.name])).map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < taskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n disabled: !state.start || !state.end || task.readOnly,\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Редактор задачи\nP8PGanttTaskEditor.propTypes = {\n task: P8P_GANTT_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n numbCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Диаграмма Ганта\nconst P8PGantt = ({\n height,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n zoom,\n tasks,\n taskAttributes,\n taskColors,\n onTaskDatesChange,\n onTaskProgressChange,\n taskAttributeRenderer,\n noDataFoundText,\n numbTaskEditorCaption,\n nameTaskEditorCaption,\n startTaskEditorCaption,\n endTaskEditorCaption,\n progressTaskEditorCaption,\n legendTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n gantt: null,\n zoom: P8P_GANTT_ZOOM.includes(zoom) ? zoom : 3,\n editTask: null\n });\n\n //Отображение диаграммы\n const showGantt = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (!state.gantt) {\n // eslint-disable-next-line no-undef\n const gantt = new Gantt(\"#__gantt__\", tasks, {\n view_mode: P8P_GANTT_ZOOM_VIEW_MODES[state.zoom],\n date_format: \"YYYY-MM-DD\",\n language: \"ru\",\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n on_date_change: (task, start, end, isMain) => onTaskDatesChange ? onTaskDatesChange({\n task,\n start,\n end,\n isMain\n }) : null,\n on_progress_change: (task, progress) => onTaskProgressChange ? onTaskProgressChange({\n task,\n progress\n }) : null,\n on_click: openTaskEditor\n });\n setState(pv => ({\n ...pv,\n gantt,\n noData: false\n }));\n } else {\n state.gantt.refresh(tasks);\n setState(pv => ({\n ...pv,\n noData: false\n }));\n }\n }, [state.gantt, state.zoom, readOnly, readOnlyDates, readOnlyProgress, tasks, onTaskDatesChange, onTaskProgressChange]);\n\n //Обновление масштаба диаграммы\n const handleZoomChange = direction => setState(pv => ({\n ...pv,\n zoom: pv.zoom + direction < 0 ? 0 : pv.zoom + direction >= P8P_GANTT_ZOOM.length ? P8P_GANTT_ZOOM.length - 1 : pv.zoom + direction\n }));\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = ({\n task,\n start,\n end,\n progress\n }) => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n if (onTaskDatesChange && (task.start != start || task.end != end)) onTaskDatesChange({\n task,\n start,\n end,\n isMain: true\n });\n if (onTaskProgressChange && task.progress != progress) onTaskProgressChange({\n task,\n progress\n });\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При изменении масштаба\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.gantt) state.gantt.change_view_mode(P8P_GANTT_ZOOM_VIEW_MODES[state.zoom]);\n }, [state.gantt, state.zoom]);\n\n //При изменении списка задач\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (Array.isArray(tasks) && tasks.length > 0) showGantt();else setState(pv => ({\n ...pv,\n noData: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tasks]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, state.gantt && state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.gantt && !state.noData && title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 1,\n sx: {\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, state.gantt && !state.noData && zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_GANTT_ZOOM.length - 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_out\"))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PGanttTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n taskColors: taskColors,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n numbCaption: numbTaskEditorCaption,\n nameCaption: nameTaskEditorCaption,\n startCaption: startTaskEditorCaption,\n endCaption: endTaskEditorCaption,\n progressCaption: progressTaskEditorCaption,\n legendCaption: legendTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n height,\n display: state.noData ? \"none\" : \"\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n height: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_SHAPE).isRequired,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onTaskDatesChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onTaskProgressChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n numbTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_gantt.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PGantt: () => (/* binding */ P8PGantt),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* binding */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* binding */ P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* binding */ P8P_GANTT_TASK_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Slider/Slider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Диаграмма Ганта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_GANTT_ZOOM = [0, 1, 2, 3, 4];\n\n//Уровни масштаба (строковые наименования в терминах библиотеки)\nconst P8P_GANTT_ZOOM_VIEW_MODES = {\n 0: \"Quarter Day\",\n 1: \"Half Day\",\n 2: \"Day\",\n 3: \"Week\",\n 4: \"Month\"\n};\n\n//Структура задачи\nconst P8P_GANTT_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number).isRequired,\n numb: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n dependencies: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_GANTT_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Структура описания цвета задачи\nconst P8P_GANTT_TASK_COLOR_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n numbCaption,\n nameCaption,\n startCaption,\n endCaption,\n progressCaption,\n legendCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end,\n progress: task.progress\n });\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk({\n task,\n start: state.start,\n end: state.end,\n progress: state.progress\n }) : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //При изменении сроков\n const handlePeriodChanged = e => setState(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //При изменении прогресса\n const handleProgressChanged = (e, newValue) => setState(prev => ({\n ...prev,\n progress: newValue\n }));\n\n //Описание легенды для задачи\n let legend = null;\n if (Array.isArray(taskColors)) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) legend = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: {\n ...(colorDesc.bgProgressColor ? {\n background: `linear-gradient(to right, ${colorDesc.bgProgressColor} ,${colorDesc.bgColor ? colorDesc.bgColor : \"transparent\"})}`\n } : colorDesc.bgColor ? {\n backgroundColor: colorDesc.bgColor\n } : {}),\n ...(colorDesc.textColor ? {\n color: colorDesc.textColor\n } : {})\n }\n },\n primary: legendCaption,\n secondary: colorDesc.desc\n });\n }\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: numbCaption,\n secondary: task.numb\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: startCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.start,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.start,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: endCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.end,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.end,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), hasValue(task.progress) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: `${progressCaption}${task.readOnly === true || task.readOnlyProgress === true ? ` (${task.progress}%)` : \"\"}`,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n disabled: task.readOnly === true || task.readOnlyProgress === true,\n defaultValue: task.progress,\n valueLabelDisplay: \"auto\",\n onChange: handleProgressChanged\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, legend ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, legend), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n })) : null, Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => hasValue(task[attr.name])).map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < taskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n disabled: !state.start || !state.end || task.readOnly,\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Редактор задачи\nP8PGanttTaskEditor.propTypes = {\n task: P8P_GANTT_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n numbCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Диаграмма Ганта\nconst P8PGantt = ({\n height,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n zoom,\n tasks,\n taskAttributes,\n taskColors,\n onTaskDatesChange,\n onTaskProgressChange,\n taskAttributeRenderer,\n noDataFoundText,\n numbTaskEditorCaption,\n nameTaskEditorCaption,\n startTaskEditorCaption,\n endTaskEditorCaption,\n progressTaskEditorCaption,\n legendTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n gantt: null,\n zoom: P8P_GANTT_ZOOM.includes(zoom) ? zoom : 3,\n editTask: null\n });\n\n //Отображение диаграммы\n const showGantt = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (!state.gantt) {\n // eslint-disable-next-line no-undef\n const gantt = new Gantt(\"#__gantt__\", tasks, {\n view_mode: P8P_GANTT_ZOOM_VIEW_MODES[state.zoom],\n date_format: \"YYYY-MM-DD\",\n language: \"ru\",\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n on_date_change: (task, start, end, isMain) => onTaskDatesChange ? onTaskDatesChange({\n task,\n start,\n end,\n isMain\n }) : null,\n on_progress_change: (task, progress) => onTaskProgressChange ? onTaskProgressChange({\n task,\n progress\n }) : null,\n on_click: openTaskEditor\n });\n setState(pv => ({\n ...pv,\n gantt,\n noData: false\n }));\n } else {\n state.gantt.refresh(tasks);\n setState(pv => ({\n ...pv,\n noData: false\n }));\n }\n }, [state.gantt, state.zoom, readOnly, readOnlyDates, readOnlyProgress, tasks, onTaskDatesChange, onTaskProgressChange]);\n\n //Обновление масштаба диаграммы\n const handleZoomChange = direction => setState(pv => ({\n ...pv,\n zoom: pv.zoom + direction < 0 ? 0 : pv.zoom + direction >= P8P_GANTT_ZOOM.length ? P8P_GANTT_ZOOM.length - 1 : pv.zoom + direction\n }));\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = ({\n task,\n start,\n end,\n progress\n }) => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n if (onTaskDatesChange && (task.start != start || task.end != end)) onTaskDatesChange({\n task,\n start,\n end,\n isMain: true\n });\n if (onTaskProgressChange && task.progress != progress) onTaskProgressChange({\n task,\n progress\n });\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При изменении масштаба\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.gantt) state.gantt.change_view_mode(P8P_GANTT_ZOOM_VIEW_MODES[state.zoom]);\n }, [state.gantt, state.zoom]);\n\n //При изменении списка задач\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (Array.isArray(tasks) && tasks.length > 0) showGantt();else setState(pv => ({\n ...pv,\n noData: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tasks]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, state.gantt && state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.gantt && !state.noData && title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 1,\n sx: {\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, state.gantt && !state.noData && zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_GANTT_ZOOM.length - 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_out\"))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PGanttTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n taskColors: taskColors,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n numbCaption: numbTaskEditorCaption,\n nameCaption: nameTaskEditorCaption,\n startCaption: startTaskEditorCaption,\n endCaption: endTaskEditorCaption,\n progressCaption: progressTaskEditorCaption,\n legendCaption: legendTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n height,\n display: state.noData ? \"none\" : \"\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n height: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_SHAPE).isRequired,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onTaskDatesChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onTaskProgressChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n numbTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_gantt.js?"); /***/ }), @@ -3260,7 +3139,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\n Парус 8 - Панели мониторинга\n Компонент: Меню панелей\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"center\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n }\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"64px\",\n height: \"64px\",\n fontSize: \"64px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), panel.caption)));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Меню панелей\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"center\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n }\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"64px\",\n height: \"64px\",\n fontSize: \"64px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), panel.caption)));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); /***/ }), @@ -3271,7 +3150,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Компонент: Таблица\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any)\n});\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Панель инструментов столбца\nconst P8PTableColumnToolBar = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if (hasValue(filter?.from) || hasValue(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"filter_alt\"));\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца\nP8PTableColumnToolBar.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n pb: 2\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", hasValue(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, hasValue(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, hasValue(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, hasValue(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n rows,\n orders,\n filters,\n size,\n morePages,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged\n}) => {\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Определение списка видимых колонок\n const visibleColumns = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => columnsDef.filter(columnDef => columnDef.visible === true), [columnsDef]);\n\n //Определение количества видимых колонок\n const visibleColumnsCount = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => visibleColumns.length + (expandable === true ? 1 : 0), [visibleColumns, expandable]);\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = dataType => dataType === P8P_TABLE_DATA_TYPE.DATE ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = dataType => dataType === P8P_TABLE_DATA_TYPE.DATE ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n component: _mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\"\n }) : null, visibleColumns.map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef.dataType),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef.dataType),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBar, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, rows.length > 0 ? rows.map((row, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, visibleColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef.dataType),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n sx: STYLES.TABLE_CELL_EXPAND_CONTAINER,\n colSpan: visibleColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null)) : null)), rows.length == 0 ? noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null : morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnCaption)) : null));\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array)\n })).isRequired,\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8p_table_reducer */ \"./app/components/p8p_table_reducer.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\",\n EXPAND_TOGGLE: \"EXPAND_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any)\n});\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Панель инструментов столбца (левая)\nconst P8PTableColumnToolBarLeft = ({\n columnDef,\n onItemClick\n}) => {\n //Кнопка развёртывания/свёртывания\n let expButton = null;\n if (columnDef.expandable) expButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, columnDef.expanded ? \"indeterminate_check_box\" : \"add_box\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, expButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (левая)\nP8PTableColumnToolBarLeft.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Панель инструментов столбца (правая)\nconst P8PTableColumnToolBarRight = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if ((0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.from) || (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"filter_alt\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (правая)\nP8PTableColumnToolBarRight.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n pb: 2\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n groups = [{}],\n rows,\n orders,\n filters,\n size,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - описание заголовка\n const [header, dispatchHeaderAction] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.p8pTableReducer, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.HEADER_INITIAL_STATE)());\n\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояния - развёрнутые группы\n const [expandedGroups, setExpandedGroups] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Формирование заголовка таблицы\n const setHeader = ({\n columnsDef,\n expandable,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.SET_HEADER,\n payload: {\n columnsDef,\n expandable,\n objectsCopier\n }\n });\n\n //Сворачивание/разворачивание уровня заголовка таблицы\n const toggleHeaderExpand = ({\n columnName,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.TOGGLE_HEADER_EXPAND,\n payload: {\n columnName,\n expandable,\n objectsCopier\n }\n });\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE:\n toggleHeaderExpand({\n columnName,\n objectsCopier\n });\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //При изменении описания колонок\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setHeader({\n columnsDef,\n expandable,\n objectsCopier\n });\n }, [columnsDef, expandable, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n colSpan: header.displayDataColumnsCount,\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle\n }\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.TABLE_COLUMN_STACK\n }, group.expandable ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => {\n setExpandedGroups(pv => ({\n ...pv,\n ...{\n [group.name]: !pv[group.name]\n }\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expandedGroups[group.name] ? \"indeterminate_check_box\" : \"add_box\")) : null, customRender.data ? customRender.data : group.caption));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n component: _mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], null, header.displayLevels.map(level => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: level\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\"\n }) : null, header.displayLevelsColumns[level].map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n },\n rowSpan: columnDef.rowSpan,\n colSpan: columnDef.colSpan\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarLeft, {\n columnDef: columnDef,\n onItemClick: handleToolBarItemClick\n }), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarRight, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, rows.length > 0 ? groups.map((group, g) => {\n const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, header.displayDataColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: STYLES.TABLE_CELL_EXPAND_CONTAINER,\n colSpan: header.displayDataColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null) : null);\n return !group?.name ? rowsView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `group-${g}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : null)), rows.length == 0 ? noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null : morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnCaption)) : null));\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n parent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })).isRequired,\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); + +/***/ }), + +/***/ "./app/components/p8p_table_reducer.js": +/*!*********************************************!*\ + !*** ./app/components/p8p_table_reducer.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HEADER_INITIAL_STATE: () => (/* binding */ HEADER_INITIAL_STATE),\n/* harmony export */ P8P_TABLE_AT: () => (/* binding */ P8P_TABLE_AT),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ p8pTableReducer: () => (/* binding */ p8pTableReducer)\n/* harmony export */ });\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица - редьюсер состояния\r\n*/\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst P8P_TABLE_AT = {\n SET_HEADER: \"SET_HEADER\",\n //Установка заголовка таблицы\n TOGGLE_HEADER_EXPAND: \"TOGGLE_HEADER_EXPAND\" //Сворачивание/разворачивание уровня заголовка\n};\n\n//Состояние заголовка таблицы по умолчанию\nconst HEADER_INITIAL_STATE = () => ({\n columnsDef: [],\n displayLevels: [],\n displayLevelsColumns: {},\n displayDataColumnsCount: 0,\n displayDataColumns: []\n});\n\n//Состояние описания ячейки заголовка таблицы по умолчанию\nconst HEADER_COLUMN_INITIAL_STATE = ({\n columnDef,\n objectsCopier\n}) => {\n const tmp = objectsCopier(columnDef);\n if (!hasValue(tmp.parent)) tmp.parent = \"\";\n if (!hasValue(tmp.expandable)) tmp.expandable = false;\n if (!hasValue(tmp.expanded)) tmp.expanded = true;\n return tmp;\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== undefined && value !== null && value !== \"\";\n\n//Определение высоты (в уровнях) ячейки заголовка\nconst getDisplayColumnRowSpan = (displayTree, maxLevel) => {\n displayTree.forEach(columnDef => {\n columnDef.rowSpan = columnDef.hasChild ? maxLevel - columnDef.childMaxLevel + 1 : maxLevel - columnDef.level + 1;\n if (columnDef.hasChild) getDisplayColumnRowSpan(columnDef.child, maxLevel);\n });\n};\n\n//Определение ширины (в колонках) ячейки заголовка\nconst getDisplayColumnColSpan = (displayTree, columnDef) => {\n if (columnDef.hasChild) {\n let colSpan = 0;\n displayTree.forEach(cD => cD.parent == columnDef.name ? colSpan += getDisplayColumnColSpan(cD.child, cD) : null);\n return colSpan;\n } else return 1;\n};\n\n//Формирование дерева отображаемых элементов заголовка\nconst buildDisplayTree = (columnsDef, parent, level) => {\n const baseBuild = (columnsDef, parent, level) => {\n let maxLevel = level - 1;\n const res = columnsDef.filter(columnDef => columnDef.parent == parent && columnDef.visible).map(columnDef => {\n const [child, childMaxLevel] = columnDef.expanded ? baseBuild(columnsDef, columnDef.name, level + 1) : [[], level];\n if (childMaxLevel > maxLevel) maxLevel = childMaxLevel;\n const res = {\n ...columnDef,\n child,\n hasChild: child.length > 0 ? true : false,\n level,\n childMaxLevel: child.length > 0 ? childMaxLevel : 0\n };\n return {\n ...res,\n colSpan: getDisplayColumnColSpan(child, res),\n rowSpan: 1\n };\n });\n return [res, maxLevel];\n };\n const [displayTree, maxLevel] = baseBuild(columnsDef, parent, level);\n getDisplayColumnRowSpan(displayTree, maxLevel);\n return [displayTree, maxLevel];\n};\n\n//Формирование коллекции отображаемых колонок уровня\nconst buildDisplayLevelsColumns = (displayTree, maxLevel) => {\n const extractLevel = (displayTree, level) => {\n let res = [];\n displayTree.forEach(columnDef => {\n if (columnDef.level == level) res.push(columnDef);\n if (columnDef.hasChild) res = res.concat(extractLevel(columnDef.child, level));\n });\n return res;\n };\n const displayLevels = [...Array(maxLevel).keys()].map(i => i + 1);\n const displayLevelsColumns = {};\n displayLevels.forEach(level => displayLevelsColumns[level] = extractLevel(displayTree, level));\n return [displayLevels, displayLevelsColumns];\n};\n\n//Формирование коллекции отображаемых колонок данных\nconst buildDisplayDataColumns = (displayTree, expandable) => {\n const displayDataColumns = [];\n const traverseTree = displayTree => {\n displayTree.forEach(columnDef => !columnDef.hasChild ? displayDataColumns.push(columnDef) : traverseTree(columnDef.child));\n };\n traverseTree(displayTree);\n return [displayDataColumns, displayDataColumns.length + (expandable === true ? 1 : 0)];\n};\n\n//Формирование описания отображаемых колонок\nconst buildDisplay = ({\n columnsDef,\n expandable\n}) => {\n //Сформируем дерево отображаемых колонок заголовка\n const [displayTree, maxLevel] = buildDisplayTree(columnsDef, \"\", 1);\n //Вытянем дерево в удобные для рендеринга структуры\n const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //Сформируем отображаемые колонки данных\n const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n //Вернём результат\n return [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount];\n};\n\n//Формирование описания заголовка\nconst buildHeaderDef = ({\n columnsDef,\n expandable,\n objectsCopier\n}) => {\n //Инициализируем результат\n const res = HEADER_INITIAL_STATE();\n //Инициализируем внутренне описание колонок и поместим его в результат\n columnsDef.forEach(columnDef => res.columnsDef.push(HEADER_COLUMN_INITIAL_STATE({\n columnDef,\n objectsCopier\n })));\n //Добавим в результат сведения об отображаемых данных\n [res.displayLevels, res.displayLevelsColumns, res.displayDataColumns, res.displayDataColumnsCount] = buildDisplay({\n columnsDef: res.columnsDef,\n expandable\n });\n //Сформируем дерево отображаемых колонок заголовка\n //const [displayTree, maxLevel] = buildDisplayTree(res.columnsDef, \"\", 1);\n //Вытянем дерево в удобные для рендеринга структуры\n //[res.displayLevels, res.displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //Сформируем отображаемые колонки данных\n //[res.displayDataColumns, res.displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n //Вернём результат\n return res;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Формирование заголовка\n [P8P_TABLE_AT.SET_HEADER]: (state, {\n payload\n }) => {\n const {\n columnsDef,\n expandable,\n objectsCopier\n } = payload;\n return {\n ...state,\n ...buildHeaderDef({\n columnsDef,\n expandable,\n objectsCopier\n })\n };\n },\n [P8P_TABLE_AT.TOGGLE_HEADER_EXPAND]: (state, {\n payload\n }) => {\n const {\n columnName,\n expandable,\n objectsCopier\n } = payload;\n const columnsDef = objectsCopier(state.columnsDef);\n columnsDef.forEach(columnDef => columnDef.name == columnName ? columnDef.expanded = !columnDef.expanded : null);\n const [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount] = buildDisplay({\n columnsDef,\n expandable\n });\n //const [displayTree, maxLevel] = buildDisplayTree(columnsDef, \"\", 1);\n //const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n return {\n ...state,\n columnsDef,\n displayLevels,\n displayLevelsColumns,\n displayDataColumns,\n displayDataColumnsCount\n };\n },\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst p8pTableReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table_reducer.js?"); /***/ }), @@ -3282,7 +3172,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigWrapper: () => (/* binding */ ConfigWrapper),\n/* harmony export */ P8PAppWorkspaceConfigWrapped: () => (/* binding */ P8PAppWorkspaceConfigWrapped),\n/* harmony export */ P8PDataGridConfigWrapped: () => (/* binding */ P8PDataGridConfigWrapped),\n/* harmony export */ P8PGanttConfigWrapped: () => (/* binding */ P8PGanttConfigWrapped),\n/* harmony export */ P8PPanelsMenuGridConfigWrapped: () => (/* binding */ P8PPanelsMenuGridConfigWrapped),\n/* harmony export */ P8PTableConfigWrapped: () => (/* binding */ P8PTableConfigWrapped),\n/* harmony export */ P8P_APP_WORKSPACE_CONFIG_PROPS: () => (/* binding */ P8P_APP_WORKSPACE_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_CONFIG_PROPS: () => (/* binding */ P8P_DATA_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE),\n/* harmony export */ P8P_GANTT_CONFIG_PROPS: () => (/* binding */ P8P_GANTT_CONFIG_PROPS),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_SHAPE),\n/* harmony export */ P8P_PANELS_MENU_GRID_CONFIG_PROPS: () => (/* binding */ P8P_PANELS_MENU_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* reexport safe */ _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8P_PANELS_MENU_PANEL_SHAPE),\n/* harmony export */ P8P_TABLE_CONFIG_PROPS: () => (/* binding */ P8P_TABLE_CONFIG_PROPS),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_table */ \"./app/components/p8p_table.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\n Парус 8 - Панели мониторинга\n Обёртки для компонент, обеспечивающие подключение их к настройкам приложения\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Вспомогательные процедуры и функции\n //Текстовые ресурсы и константы\n //Меню панелей\n //Рабочее пространство\n //Таблица данных\n //Таблица данных\n //Диаграмма Ганта\n\n//---------\n//Константы\n//---------\n\n//Конфигурируемые свойства \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8P_PANELS_MENU_GRID_CONFIG_PROPS = {\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE,\n defaultGroupTytle: _app_text__WEBPACK_IMPORTED_MODULE_2__.TITLES.DEFAULT_PANELS_GROUP\n};\n\n//Конфигурируемые свойства \"Рабочего пространства\" (P8PAppWorkspace)\nconst P8P_APP_WORKSPACE_CONFIG_PROPS = {\n closeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLOSE,\n homeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE_HOME\n};\n\n//Конфигурируемые свойства \"Таблицы\" (P8PTable)\nconst P8P_TABLE_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND\n};\n\n//Конфигурируемые свойства \"Таблицы данных\" (P8PDataGrid)\nconst P8P_DATA_GRID_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n objectsCopier: _core_utils__WEBPACK_IMPORTED_MODULE_1__.deepCopyObject\n};\n\n//Конфигурируемые свойства \"Диаграммы Ганта\" (P8PGantt)\nconst P8P_GANTT_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n numbTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NUMB,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n startTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.START,\n endTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.END,\n progressTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.PROGRESS,\n legendTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.LEGEND,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//-----------------------\n//Вспомогательные функции\n//-----------------------\n\n//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов\nconst addConfigChildProps = children => react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(child)) return child;\n const {\n children,\n ...restProps\n } = child.props;\n let configProps = {};\n if (child.type.name === \"P8PPanelsMenuGrid\") configProps = P8P_PANELS_MENU_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PTable\") configProps = P8P_TABLE_CONFIG_PROPS;\n if (child.type.name === \"P8PDataGrid\") configProps = P8P_DATA_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PGantt\") configProps = P8P_GANTT_CONFIG_PROPS;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(child.type, {\n ...configProps,\n ...restProps\n }, addConfigChildProps(children));\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для компонента \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8PPanelsMenuGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8PPanelsMenuGrid, _extends({}, P8P_PANELS_MENU_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Рабочее пространство\" (P8PAppWorkspace)\nconst P8PAppWorkspaceConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, P8P_APP_WORKSPACE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица\" (P8PTable)\nconst P8PTableConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8PTable, _extends({}, P8P_TABLE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица данных\" (P8PDataGrid)\nconst P8PDataGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, P8P_DATA_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Диаграмма Ганта\" (P8PGantt)\nconst P8PGanttConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Универсальный элемент-обёртка в параметры конфигурации\nconst ConfigWrapper = ({\n children\n}) => addConfigChildProps(children);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/config_wrapper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigWrapper: () => (/* binding */ ConfigWrapper),\n/* harmony export */ P8PAppWorkspaceConfigWrapped: () => (/* binding */ P8PAppWorkspaceConfigWrapped),\n/* harmony export */ P8PDataGridConfigWrapped: () => (/* binding */ P8PDataGridConfigWrapped),\n/* harmony export */ P8PGanttConfigWrapped: () => (/* binding */ P8PGanttConfigWrapped),\n/* harmony export */ P8PPanelsMenuGridConfigWrapped: () => (/* binding */ P8PPanelsMenuGridConfigWrapped),\n/* harmony export */ P8PTableConfigWrapped: () => (/* binding */ P8PTableConfigWrapped),\n/* harmony export */ P8P_APP_WORKSPACE_CONFIG_PROPS: () => (/* binding */ P8P_APP_WORKSPACE_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_CONFIG_PROPS: () => (/* binding */ P8P_DATA_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE),\n/* harmony export */ P8P_GANTT_CONFIG_PROPS: () => (/* binding */ P8P_GANTT_CONFIG_PROPS),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_SHAPE),\n/* harmony export */ P8P_PANELS_MENU_GRID_CONFIG_PROPS: () => (/* binding */ P8P_PANELS_MENU_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* reexport safe */ _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8P_PANELS_MENU_PANEL_SHAPE),\n/* harmony export */ P8P_TABLE_CONFIG_PROPS: () => (/* binding */ P8P_TABLE_CONFIG_PROPS),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_table */ \"./app/components/p8p_table.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Обёртки для компонент, обеспечивающие подключение их к настройкам приложения\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Вспомогательные процедуры и функции\n //Текстовые ресурсы и константы\n //Меню панелей\n //Рабочее пространство\n //Таблица данных\n //Таблица данных\n //Диаграмма Ганта\n\n//---------\n//Константы\n//---------\n\n//Конфигурируемые свойства \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8P_PANELS_MENU_GRID_CONFIG_PROPS = {\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE,\n defaultGroupTytle: _app_text__WEBPACK_IMPORTED_MODULE_2__.TITLES.DEFAULT_PANELS_GROUP\n};\n\n//Конфигурируемые свойства \"Рабочего пространства\" (P8PAppWorkspace)\nconst P8P_APP_WORKSPACE_CONFIG_PROPS = {\n closeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLOSE,\n homeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE_HOME\n};\n\n//Конфигурируемые свойства \"Таблицы\" (P8PTable)\nconst P8P_TABLE_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND\n};\n\n//Конфигурируемые свойства \"Таблицы данных\" (P8PDataGrid)\nconst P8P_DATA_GRID_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n objectsCopier: _core_utils__WEBPACK_IMPORTED_MODULE_1__.deepCopyObject\n};\n\n//Конфигурируемые свойства \"Диаграммы Ганта\" (P8PGantt)\nconst P8P_GANTT_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n numbTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NUMB,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n startTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.START,\n endTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.END,\n progressTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.PROGRESS,\n legendTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.LEGEND,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//-----------------------\n//Вспомогательные функции\n//-----------------------\n\n//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов\nconst addConfigChildProps = children => react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(child)) return child;\n const {\n children,\n ...restProps\n } = child.props;\n let configProps = {};\n if (child.type.name === \"P8PPanelsMenuGrid\") configProps = P8P_PANELS_MENU_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PTable\") configProps = P8P_TABLE_CONFIG_PROPS;\n if (child.type.name === \"P8PDataGrid\") configProps = P8P_DATA_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PGantt\") configProps = P8P_GANTT_CONFIG_PROPS;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(child.type, {\n ...configProps,\n ...restProps\n }, addConfigChildProps(children));\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для компонента \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8PPanelsMenuGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8PPanelsMenuGrid, _extends({}, P8P_PANELS_MENU_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Рабочее пространство\" (P8PAppWorkspace)\nconst P8PAppWorkspaceConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, P8P_APP_WORKSPACE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица\" (P8PTable)\nconst P8PTableConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8PTable, _extends({}, P8P_TABLE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица данных\" (P8PDataGrid)\nconst P8PDataGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, P8P_DATA_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Диаграмма Ганта\" (P8PGantt)\nconst P8PGanttConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Универсальный элемент-обёртка в параметры конфигурации\nconst ConfigWrapper = ({\n children\n}) => addConfigChildProps(children);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/config_wrapper.js?"); /***/ }), @@ -3293,7 +3183,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ApplicationContext: () => (/* binding */ ApplicationContext),\n/* harmony export */ \"ApplicationСtx\": () => (/* binding */ ApplicationСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _application_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./application_reducer */ \"./app/context/application_reducer.js\");\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/context/backend.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Приложение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Редьюсер состояния\n //Контекст отображения сообщений\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Клиентский API \"ПАРУС 8 Онлайн\"\nconst P8O_API = window.top?.parus?.clientApi;\n\n//Структура объекта с описанием ошибок\nconst APPLICATION_CONTEXT_ERRORS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n P8O_API_UNAVAILABLE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст приложения\nconst ApplicationСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста приложения\nconst ApplicationContext = ({\n errors,\n displaySizeGetter,\n guidGenerator,\n config,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_application_reducer__WEBPACK_IMPORTED_MODULE_1__.applicationReducer, (0,_application_reducer__WEBPACK_IMPORTED_MODULE_1__.INITIAL_STATE)(displaySizeGetter));\n\n //Подключение к контексту взаимодействия с сервером\n const {\n getConfig,\n getRespPayload\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту отображения сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Установка флага инициализированности приложения\n const setInitialized = () => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_INITIALIZED\n });\n\n //Установка текущего размера экрана\n const setDisplaySize = displaySize => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_DISPLAY_SIZE,\n payload: displaySize\n });\n\n //Установка базового URL приложения\n const setUrlBase = urlBase => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_URL_BASE,\n payload: urlBase\n });\n\n //Установка списка панелей\n const setPanels = panels => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.LOAD_PANELS,\n payload: panels\n });\n\n //Поиск раздела по имени\n const findPanelByName = name => state.panels.find(panel => panel.name == name);\n\n //Отображение закладки \"ПАРУС 8 Онлайн\" с указанным URL\n const pOnlineShowTab = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n url,\n caption,\n onClose\n }) => {\n if (P8O_API) {\n const _id = id || guidGenerator();\n P8O_API.ui.openTab({\n id: _id,\n url,\n caption,\n onClose: () => onClose ? onClose(_id) : null\n });\n return _id;\n } else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение раздела \"ПАРУС 8 Онлайн\"\n const pOnlineShowUnit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение документа \"ПАРУС 8 Онлайн\"\n const pOnlineShowDocument = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n document,\n showMethod = \"main\",\n inRnParameter = \"in_RN\"\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение словаря \"ПАРУС 8 Онлайн\"\n const pOnlineShowDictionary = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.openDictionary({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательской процедуры \"ПАРУС 8 Онлайн\"\n const pOnlineUserProcedure = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.performUserProcedureSync({\n code,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательского отчёта \"ПАРУС 8 Онлайн\"\n const pOnlineUserReport = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.performUserReport({\n code,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Получение количества записей на странице\n const configSystemPageSize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);\n\n //Получение базового URL приложения\n const configUrlBase = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => state.urlBase, [state.urlBase]);\n\n //Инициализация приложения\n const initApp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Читаем конфигурацию с сервера\n let res = await getConfig();\n //Сохраняем базовый URL приложения\n setUrlBase(getRespPayload(res)?.Panels?.urlBase);\n //Сохраняем список панелей\n setPanels(getRespPayload(res)?.Panels?.Panel);\n //Установим флаг завершения инициализации\n setInitialized();\n }, [getConfig, getRespPayload]);\n\n //Обработка подключения контекста к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!state.initialized) {\n //Слушаем изменение размеров окна\n window.addEventListener(\"resize\", () => {\n if (displaySizeGetter) setDisplaySize(displaySizeGetter());\n });\n //Инициализируем приложение\n initApp();\n }\n }, [state.initialized, initApp, displaySizeGetter]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ApplicationСtx.Provider, {\n value: {\n findPanelByName,\n pOnlineShowTab,\n pOnlineShowUnit,\n pOnlineShowDocument,\n pOnlineShowDictionary,\n pOnlineUserProcedure,\n pOnlineUserReport,\n configSystemPageSize,\n configUrlBase,\n appState: state\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста приложения\nApplicationContext.propTypes = {\n errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,\n displaySizeGetter: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func),\n guidGenerator: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired,\n config: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object).isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ApplicationContext: () => (/* binding */ ApplicationContext),\n/* harmony export */ \"ApplicationСtx\": () => (/* binding */ ApplicationСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _application_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./application_reducer */ \"./app/context/application_reducer.js\");\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/context/backend.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Редьюсер состояния\n //Контекст отображения сообщений\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Клиентский API \"ПАРУС 8 Онлайн\"\nconst P8O_API = window.top?.parus?.clientApi;\n\n//Структура объекта с описанием ошибок\nconst APPLICATION_CONTEXT_ERRORS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n P8O_API_UNAVAILABLE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст приложения\nconst ApplicationСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста приложения\nconst ApplicationContext = ({\n errors,\n displaySizeGetter,\n guidGenerator,\n config,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_application_reducer__WEBPACK_IMPORTED_MODULE_1__.applicationReducer, (0,_application_reducer__WEBPACK_IMPORTED_MODULE_1__.INITIAL_STATE)(displaySizeGetter));\n\n //Подключение к контексту взаимодействия с сервером\n const {\n getConfig,\n getRespPayload\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту отображения сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Установка флага инициализированности приложения\n const setInitialized = () => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_INITIALIZED\n });\n\n //Установка текущего размера экрана\n const setDisplaySize = displaySize => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_DISPLAY_SIZE,\n payload: displaySize\n });\n\n //Установка базового URL приложения\n const setUrlBase = urlBase => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_URL_BASE,\n payload: urlBase\n });\n\n //Установка списка панелей\n const setPanels = panels => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.LOAD_PANELS,\n payload: panels\n });\n\n //Поиск раздела по имени\n const findPanelByName = name => state.panels.find(panel => panel.name == name);\n\n //Отображение закладки \"ПАРУС 8 Онлайн\" с указанным URL\n const pOnlineShowTab = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n url,\n caption,\n onClose\n }) => {\n if (P8O_API) {\n const _id = id || guidGenerator();\n P8O_API.ui.openTab({\n id: _id,\n url,\n caption,\n onClose: () => onClose ? onClose(_id) : null\n });\n return _id;\n } else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение раздела \"ПАРУС 8 Онлайн\"\n const pOnlineShowUnit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение документа \"ПАРУС 8 Онлайн\"\n const pOnlineShowDocument = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n document,\n showMethod = \"main\",\n inRnParameter = \"in_RN\"\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение словаря \"ПАРУС 8 Онлайн\"\n const pOnlineShowDictionary = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.openDictionary({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательской процедуры \"ПАРУС 8 Онлайн\"\n const pOnlineUserProcedure = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.performUserProcedureSync({\n code,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательского отчёта \"ПАРУС 8 Онлайн\"\n const pOnlineUserReport = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.performUserReport({\n code,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Получение количества записей на странице\n const configSystemPageSize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);\n\n //Получение базового URL приложения\n const configUrlBase = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => state.urlBase, [state.urlBase]);\n\n //Инициализация приложения\n const initApp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Читаем конфигурацию с сервера\n let res = await getConfig();\n //Сохраняем базовый URL приложения\n setUrlBase(getRespPayload(res)?.Panels?.urlBase);\n //Сохраняем список панелей\n setPanels(getRespPayload(res)?.Panels?.Panel);\n //Установим флаг завершения инициализации\n setInitialized();\n }, [getConfig, getRespPayload]);\n\n //Обработка подключения контекста к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!state.initialized) {\n //Слушаем изменение размеров окна\n window.addEventListener(\"resize\", () => {\n if (displaySizeGetter) setDisplaySize(displaySizeGetter());\n });\n //Инициализируем приложение\n initApp();\n }\n }, [state.initialized, initApp, displaySizeGetter]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ApplicationСtx.Provider, {\n value: {\n findPanelByName,\n pOnlineShowTab,\n pOnlineShowUnit,\n pOnlineShowDocument,\n pOnlineShowDictionary,\n pOnlineUserProcedure,\n pOnlineUserReport,\n configSystemPageSize,\n configUrlBase,\n appState: state\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста приложения\nApplicationContext.propTypes = {\n errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,\n displaySizeGetter: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func),\n guidGenerator: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired,\n config: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object).isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application.js?"); /***/ }), @@ -3304,7 +3194,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APP_AT: () => (/* binding */ APP_AT),\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ applicationReducer: () => (/* binding */ applicationReducer)\n/* harmony export */ });\n/*\n Парус 8 - Панели мониторинга\n Контекст: Приложение - редьюсер состояния\n*/\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst APP_AT = {\n SET_URL_BASE: \"SET_URL_BASE\",\n //Установка базового URL приложения\n LOAD_PANELS: \"LOAD_PANELS\",\n //Загрузка списка панелей\n SET_INITIALIZED: \"SET_INITIALIZED\",\n //Установка флага инициализированности приложения\n SET_DISPLAY_SIZE: \"SET_DISPLAY_SIZE\" //Установка текущего типового размера экрана\n};\n\n//Состояние приложения по умолчанию\nconst INITIAL_STATE = displaySizeGetter => ({\n displaySize: displaySizeGetter(),\n urlBase: \"\",\n panels: [],\n panelsLoaded: false,\n initialized: false\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Установка базового URL приложения\n [APP_AT.SET_URL_BASE]: (state, {\n payload\n }) => ({\n ...state,\n urlBase: payload\n }),\n //Загрузка списка панелей\n [APP_AT.LOAD_PANELS]: (state, {\n payload\n }) => {\n let panels = [];\n if (payload && Array.isArray(payload)) for (let p of payload) panels.push({\n ...p\n });\n return {\n ...state,\n panels,\n panelsLoaded: true\n };\n },\n //Установка текущего типового размера экрана\n [APP_AT.SET_INITIALIZED]: state => ({\n ...state,\n initialized: true\n }),\n //Установка текущего типового размера экрана\n [APP_AT.SET_DISPLAY_SIZE]: (state, {\n payload\n }) => ({\n ...state,\n displaySize: payload\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst applicationReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application_reducer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APP_AT: () => (/* binding */ APP_AT),\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ applicationReducer: () => (/* binding */ applicationReducer)\n/* harmony export */ });\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Приложение - редьюсер состояния\r\n*/\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst APP_AT = {\n SET_URL_BASE: \"SET_URL_BASE\",\n //Установка базового URL приложения\n LOAD_PANELS: \"LOAD_PANELS\",\n //Загрузка списка панелей\n SET_INITIALIZED: \"SET_INITIALIZED\",\n //Установка флага инициализированности приложения\n SET_DISPLAY_SIZE: \"SET_DISPLAY_SIZE\" //Установка текущего типового размера экрана\n};\n\n//Состояние приложения по умолчанию\nconst INITIAL_STATE = displaySizeGetter => ({\n displaySize: displaySizeGetter(),\n urlBase: \"\",\n panels: [],\n panelsLoaded: false,\n initialized: false\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Установка базового URL приложения\n [APP_AT.SET_URL_BASE]: (state, {\n payload\n }) => ({\n ...state,\n urlBase: payload\n }),\n //Загрузка списка панелей\n [APP_AT.LOAD_PANELS]: (state, {\n payload\n }) => {\n let panels = [];\n if (payload && Array.isArray(payload)) for (let p of payload) panels.push({\n ...p\n });\n return {\n ...state,\n panels,\n panelsLoaded: true\n };\n },\n //Установка текущего типового размера экрана\n [APP_AT.SET_INITIALIZED]: state => ({\n ...state,\n initialized: true\n }),\n //Установка текущего типового размера экрана\n [APP_AT.SET_DISPLAY_SIZE]: (state, {\n payload\n }) => ({\n ...state,\n displaySize: payload\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst applicationReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application_reducer.js?"); /***/ }), @@ -3315,7 +3205,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BackEndContext: () => (/* binding */ BackEndContext),\n/* harmony export */ \"BackEndСtx\": () => (/* binding */ BackEndСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Взаимодействие с серверным API\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Контекст сообщений\n\n//---------\n//Константы\n//---------\n\n//Структура объекта клиента\nconst BACKEND_CONTEXT_CLIENT_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n SERV_DATA_TYPE_STR: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_NUMB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_DATE: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_CLOB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n isRespErr: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespErrMessage: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespPayload: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n executeStored: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getConfig: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст взаимодействия с серверным API\nconst BackEndСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста взаимодействия с серверным API\nconst BackEndContext = ({\n client,\n children\n}) => {\n //Подключение к контексту сообщений\n const {\n showLoader,\n hideLoader,\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Проверка ответа на наличие ошибки\n const isRespErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.isRespErr(resp), [client]);\n\n //Извлечение ошибки из ответа\n const getRespErrMessage = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespErrMessage(resp), [client]);\n\n //Извлечение полезного содержимого из ответа\n const getRespPayload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespPayload(resp), [client]);\n\n //Запуск хранимой процедуры\n const executeStored = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true,\n fullResponse = false,\n spreadOutArguments = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.executeStored({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError,\n spreadOutArguments\n });\n if (fullResponse === true || isRespErr(result)) return result;else return result.XPAYLOAD;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, isRespErr, showMsgErr, client]);\n\n //Загрузка настроек панелей\n const getConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.getConfig({\n throwError\n });\n return result;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, showMsgErr, client]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BackEndСtx.Provider, {\n value: {\n SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE: client.SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB: client.SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста взаимодействия с серверным API\nBackEndContext.propTypes = {\n client: BACKEND_CONTEXT_CLIENT_SHAPE.isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/backend.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BackEndContext: () => (/* binding */ BackEndContext),\n/* harmony export */ \"BackEndСtx\": () => (/* binding */ BackEndСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Взаимодействие с серверным API\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Контекст сообщений\n\n//---------\n//Константы\n//---------\n\n//Структура объекта клиента\nconst BACKEND_CONTEXT_CLIENT_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n SERV_DATA_TYPE_STR: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_NUMB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_DATE: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n SERV_DATA_TYPE_CLOB: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n isRespErr: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespErrMessage: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getRespPayload: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n executeStored: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired,\n getConfig: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст взаимодействия с серверным API\nconst BackEndСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста взаимодействия с серверным API\nconst BackEndContext = ({\n client,\n children\n}) => {\n //Подключение к контексту сообщений\n const {\n showLoader,\n hideLoader,\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Проверка ответа на наличие ошибки\n const isRespErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.isRespErr(resp), [client]);\n\n //Извлечение ошибки из ответа\n const getRespErrMessage = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespErrMessage(resp), [client]);\n\n //Извлечение полезного содержимого из ответа\n const getRespPayload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespPayload(resp), [client]);\n\n //Запуск хранимой процедуры\n const executeStored = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true,\n fullResponse = false,\n spreadOutArguments = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.executeStored({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError,\n spreadOutArguments\n });\n if (fullResponse === true || isRespErr(result)) return result;else return result.XPAYLOAD;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, isRespErr, showMsgErr, client]);\n\n //Загрузка настроек панелей\n const getConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.getConfig({\n throwError\n });\n return result;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, showMsgErr, client]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BackEndСtx.Provider, {\n value: {\n SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE: client.SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB: client.SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста взаимодействия с серверным API\nBackEndContext.propTypes = {\n client: BACKEND_CONTEXT_CLIENT_SHAPE.isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/backend.js?"); /***/ }), @@ -3326,7 +3216,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MessagingContext: () => (/* binding */ MessagingContext),\n/* harmony export */ \"MessagingСtx\": () => (/* binding */ MessagingСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/p8p_app_progress */ \"./app/components/p8p_app_progress.js\");\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./messaging_reducer */ \"./app/context/messaging_reducer.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Сообщения\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Индикатор процесса\n //Диалог сообщения\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Структура объекта с описанием типовых заголовков\nconst MESSAGING_CONTEXT_TITLES_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n ERR: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n WARN: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n INFO: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых текстов\nconst MESSAGING_CONTEXT_TEXTS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n LOADING: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых кнопок\nconst MESSAGING_CONTEXT_BUTTONS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n CLOSE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n OK: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n CANCEL: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст сообщений\nconst MessagingСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста сообщений\nconst MessagingContext = ({\n titles,\n texts,\n buttons,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.messagingReducer, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.INITIAL_STATE);\n\n //Отображение загрузчика\n const showLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(message => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_LOADER,\n payload: message\n }), []);\n\n //Сокрытие загрузчика\n const hideLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_LOADER\n }), []);\n\n //Отображение сообщения\n const showMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((type, text, msgOnOk = null, msgOnCancel = null) => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_MSG,\n payload: {\n type,\n text,\n msgOnOk,\n msgOnCancel\n }\n }), []);\n\n //Отображение сообщения - ошибка\n const showMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - информация\n const showMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - предупреждение\n const showMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null, msgOnCancel = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN, text, msgOnOk, msgOnCancel), [showMsg]);\n\n //Сокрытие сообщения\n const hideMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((cancel = false) => {\n dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_MSG\n });\n if (!cancel && state.msgOnOk) state.msgOnOk();\n if (cancel && state.msgOnCancel) state.msgOnCancel();\n }, [state]);\n\n //Отработка нажатия на \"ОК\" в сообщении\n const handleMessageOkClick = () => {\n hideMsg(false);\n };\n\n //Отработка нажатия на \"Отмена\" в сообщении\n const handleMessageCancelClick = () => {\n hideMsg(true);\n };\n\n //Встраиваемое сообщение\n const InlineMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineMessage)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение об ошибке\n const InlineMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineError)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с информацией\n const InlineMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineInfo)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с предупреждением\n const InlineMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineWarn)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MessagingСtx.Provider, {\n value: {\n MSG_TYPE: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE,\n showLoader,\n hideLoader,\n showMsg,\n showMsgErr,\n showMsgInfo,\n showMsgWarn,\n hideMsg,\n InlineMsg,\n InlineMsgErr,\n InlineMsgInfo,\n InlineMsgWarn,\n msgState: state\n }\n }, state.loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__.P8PAppProgress, {\n open: true,\n text: state.loadingMessage || texts.LOADING\n }) : null, state.msg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppMessage, {\n open: true,\n variant: state.msgType,\n text: state.msgText,\n title: true,\n titleText: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR ? titles.ERR : state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN ? titles.WARN : titles.INFO,\n okBtn: true,\n onOk: handleMessageOkClick,\n okBtnCaption: [_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO].includes(state.msgType) ? buttons.CLOSE : buttons.OK,\n cancelBtn: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN,\n onCancel: handleMessageCancelClick,\n cancelBtnCaption: buttons.CANCEL\n }) : null, children);\n};\n\n//Контроль свойств - Провайдер контекста сообщений\nMessagingContext.propTypes = {\n titles: MESSAGING_CONTEXT_TITLES_SHAPE,\n texts: MESSAGING_CONTEXT_TEXTS_SHAPE,\n buttons: MESSAGING_CONTEXT_BUTTONS_SHAPE,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MessagingContext: () => (/* binding */ MessagingContext),\n/* harmony export */ \"MessagingСtx\": () => (/* binding */ MessagingСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/p8p_app_progress */ \"./app/components/p8p_app_progress.js\");\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./messaging_reducer */ \"./app/context/messaging_reducer.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Сообщения\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Индикатор процесса\n //Диалог сообщения\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Структура объекта с описанием типовых заголовков\nconst MESSAGING_CONTEXT_TITLES_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n ERR: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n WARN: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n INFO: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых текстов\nconst MESSAGING_CONTEXT_TEXTS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n LOADING: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//Структура объекта с описанием типовых кнопок\nconst MESSAGING_CONTEXT_BUTTONS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n CLOSE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n OK: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n CANCEL: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст сообщений\nconst MessagingСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста сообщений\nconst MessagingContext = ({\n titles,\n texts,\n buttons,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.messagingReducer, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.INITIAL_STATE);\n\n //Отображение загрузчика\n const showLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(message => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_LOADER,\n payload: message\n }), []);\n\n //Сокрытие загрузчика\n const hideLoader = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_LOADER\n }), []);\n\n //Отображение сообщения\n const showMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((type, text, msgOnOk = null, msgOnCancel = null) => dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.SHOW_MSG,\n payload: {\n type,\n text,\n msgOnOk,\n msgOnCancel\n }\n }), []);\n\n //Отображение сообщения - ошибка\n const showMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - информация\n const showMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO, text, msgOnOk), [showMsg]);\n\n //Отображение сообщения - предупреждение\n const showMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((text, msgOnOk = null, msgOnCancel = null) => showMsg(_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN, text, msgOnOk, msgOnCancel), [showMsg]);\n\n //Сокрытие сообщения\n const hideMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((cancel = false) => {\n dispatch({\n type: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_AT.HIDE_MSG\n });\n if (!cancel && state.msgOnOk) state.msgOnOk();\n if (cancel && state.msgOnCancel) state.msgOnCancel();\n }, [state]);\n\n //Отработка нажатия на \"ОК\" в сообщении\n const handleMessageOkClick = () => {\n hideMsg(false);\n };\n\n //Отработка нажатия на \"Отмена\" в сообщении\n const handleMessageCancelClick = () => {\n hideMsg(true);\n };\n\n //Встраиваемое сообщение\n const InlineMsg = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineMessage)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение об ошибке\n const InlineMsgErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineError)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с информацией\n const InlineMsgInfo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineInfo)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Встраиваемое сообщение с предупреждением\n const InlineMsgWarn = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(props => (0,_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppInlineWarn)({\n okBtn: true,\n okBtnCaption: buttons.OK,\n ...props\n }), [buttons.OK]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MessagingСtx.Provider, {\n value: {\n MSG_TYPE: _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE,\n showLoader,\n hideLoader,\n showMsg,\n showMsgErr,\n showMsgInfo,\n showMsgWarn,\n hideMsg,\n InlineMsg,\n InlineMsgErr,\n InlineMsgInfo,\n InlineMsgWarn,\n msgState: state\n }\n }, state.loading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_progress__WEBPACK_IMPORTED_MODULE_1__.P8PAppProgress, {\n open: true,\n text: state.loadingMessage || texts.LOADING\n }) : null, state.msg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_message__WEBPACK_IMPORTED_MODULE_2__.P8PAppMessage, {\n open: true,\n variant: state.msgType,\n text: state.msgText,\n title: true,\n titleText: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR ? titles.ERR : state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN ? titles.WARN : titles.INFO,\n okBtn: true,\n onOk: handleMessageOkClick,\n okBtnCaption: [_messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.ERR, _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.INFO].includes(state.msgType) ? buttons.CLOSE : buttons.OK,\n cancelBtn: state.msgType == _messaging_reducer__WEBPACK_IMPORTED_MODULE_3__.MSG_TYPE.WARN,\n onCancel: handleMessageCancelClick,\n cancelBtnCaption: buttons.CANCEL\n }) : null, children);\n};\n\n//Контроль свойств - Провайдер контекста сообщений\nMessagingContext.propTypes = {\n titles: MESSAGING_CONTEXT_TITLES_SHAPE,\n texts: MESSAGING_CONTEXT_TEXTS_SHAPE,\n buttons: MESSAGING_CONTEXT_BUTTONS_SHAPE,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging.js?"); /***/ }), @@ -3337,7 +3227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ MSG_AT: () => (/* binding */ MSG_AT),\n/* harmony export */ MSG_TYPE: () => (/* binding */ MSG_TYPE),\n/* harmony export */ messagingReducer: () => (/* binding */ messagingReducer)\n/* harmony export */ });\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Сообщения - редьюсер состояния\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Диалог сообщения\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst MSG_AT = {\n SHOW_LOADER: \"SHOW_LOADER\",\n //Отображение индикатора загрузки\n HIDE_LOADER: \"HIDE_LOADER\",\n //Сокрытие индикатора загрузки\n SHOW_MSG: \"SHOW_MSG\",\n //Отображение сообщения\n HIDE_MSG: \"HIDE_MSG\" //Сокрытие сообщения\n};\n\n//Типы сообщений\nconst MSG_TYPE = {\n INFO: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.INFO,\n //Тип диалога - информация\n WARN: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.WARN,\n //Тип диалога - предупреждение\n ERR: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.ERR //Тип диалога - ошибка\n};\n\n//Состояние сообщений по умолчанию\nconst INITIAL_STATE = {\n loading: false,\n loadingMessage: \"\",\n msg: false,\n msgType: MSG_TYPE.ERR,\n msgText: null,\n msgOnOk: null,\n msgOnCancel: null\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Отображение индикатора обработки данных\n [MSG_AT.SHOW_LOADER]: (state, {\n payload\n }) => ({\n ...state,\n loading: true,\n loadingMessage: payload\n }),\n //Сокрытие индикатора обработки данных\n [MSG_AT.HIDE_LOADER]: state => ({\n ...state,\n loading: false\n }),\n //Отображение сообщения\n [MSG_AT.SHOW_MSG]: (state, {\n payload\n }) => ({\n ...state,\n msg: true,\n msgType: payload.type || MSG_TYPE.APP_ERR,\n msgText: payload.text,\n msgOnOk: payload.msgOnOk,\n msgOnCancel: payload.msgOnCancel\n }),\n //Сокрытие сообщения\n [MSG_AT.HIDE_MSG]: state => ({\n ...state,\n msg: false,\n msgOnOk: null,\n msgOnCancel: null\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst messagingReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging_reducer.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ INITIAL_STATE: () => (/* binding */ INITIAL_STATE),\n/* harmony export */ MSG_AT: () => (/* binding */ MSG_AT),\n/* harmony export */ MSG_TYPE: () => (/* binding */ MSG_TYPE),\n/* harmony export */ messagingReducer: () => (/* binding */ messagingReducer)\n/* harmony export */ });\n/* harmony import */ var _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Сообщения - редьюсер состояния\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Диалог сообщения\n\n//---------\n//Константы\n//---------\n\n//Типы действий\nconst MSG_AT = {\n SHOW_LOADER: \"SHOW_LOADER\",\n //Отображение индикатора загрузки\n HIDE_LOADER: \"HIDE_LOADER\",\n //Сокрытие индикатора загрузки\n SHOW_MSG: \"SHOW_MSG\",\n //Отображение сообщения\n HIDE_MSG: \"HIDE_MSG\" //Сокрытие сообщения\n};\n\n//Типы сообщений\nconst MSG_TYPE = {\n INFO: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.INFO,\n //Тип диалога - информация\n WARN: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.WARN,\n //Тип диалога - предупреждение\n ERR: _components_p8p_app_message__WEBPACK_IMPORTED_MODULE_0__.P8P_APP_MESSAGE_VARIANT.ERR //Тип диалога - ошибка\n};\n\n//Состояние сообщений по умолчанию\nconst INITIAL_STATE = {\n loading: false,\n loadingMessage: \"\",\n msg: false,\n msgType: MSG_TYPE.ERR,\n msgText: null,\n msgOnOk: null,\n msgOnCancel: null\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обработчики действий\nconst handlers = {\n //Отображение индикатора обработки данных\n [MSG_AT.SHOW_LOADER]: (state, {\n payload\n }) => ({\n ...state,\n loading: true,\n loadingMessage: payload\n }),\n //Сокрытие индикатора обработки данных\n [MSG_AT.HIDE_LOADER]: state => ({\n ...state,\n loading: false\n }),\n //Отображение сообщения\n [MSG_AT.SHOW_MSG]: (state, {\n payload\n }) => ({\n ...state,\n msg: true,\n msgType: payload.type || MSG_TYPE.APP_ERR,\n msgText: payload.text,\n msgOnOk: payload.msgOnOk,\n msgOnCancel: payload.msgOnCancel\n }),\n //Сокрытие сообщения\n [MSG_AT.HIDE_MSG]: state => ({\n ...state,\n msg: false,\n msgOnOk: null,\n msgOnCancel: null\n }),\n //Обработчик по умолчанию\n DEFAULT: state => state\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Константы\n\n\n//Редьюсер состояния\nconst messagingReducer = (state, action) => {\n //Подберём обработчик\n const handle = handlers[action.type] || handlers.DEFAULT;\n //Исполним его\n return handle(state, action);\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/messaging_reducer.js?"); /***/ }), @@ -3348,7 +3238,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NavigationContext: () => (/* binding */ NavigationContext),\n/* harmony export */ NavigationCtx: () => (/* binding */ NavigationCtx),\n/* harmony export */ getRootLocation: () => (/* binding */ getRootLocation)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! query-string */ \"./node_modules/query-string/index.js\");\n/* harmony import */ var _application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./application */ \"./app/context/application.js\");\n/*\n Парус 8 - Панели мониторинга\n Контекст: Навигация\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Роутер приложения\n //Работа со строкой запроса\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Типовые пути\nconst PATHS = {\n ROOT: \"/\" //Корень приложения\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Получение корневого пути\nconst getRootLocation = () => PATHS.ROOT;\n\n//Контекст навигации\nconst NavigationCtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста навигации\nconst NavigationContext = ({\n children\n}) => {\n //Подключение к объекту роутера для управления навигацией\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useLocation)();\n\n //Подключение к объекту роутера для управления навигацией\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate)();\n\n //Подключение к контексту приложения\n const {\n findPanelByName\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Проверка наличия параметров запроса\n const isNavigationSearch = () => location.search ? true : false;\n\n //Считываение параметров запроса\n const getNavigationSearch = () => query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].parse(location.search);\n\n //Проверка наличия параметров запроса (передаваемых через состояние)\n const isNavigationState = () => location.state ? true : false;\n\n //Считываение параметров запроса (передаваемых через состояние)\n const getNavigationState = () => isNavigationState() ? JSON.parse(location.state) : null;\n\n //Обновление текущей страницы\n const refresh = () => window.location.reload();\n\n //Возврат на предыдущую страницу\n const navigateBack = () => navigate(-1);\n\n //Переход к адресу внутри приложения\n const navigateTo = ({\n path,\n search,\n state,\n replace = false\n }) => {\n //Если указано куда переходить\n if (path) {\n //Переходим к адресу\n if (state) navigate(path, {\n state: JSON.stringify(state),\n replace\n });else navigate({\n pathname: path,\n search: query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].stringify(search),\n replace\n });\n //Флаг успешного перехода\n return true;\n }\n //Переход не состоялся\n else return false;\n };\n\n //Переход к домашней страничке\n const navigateRoot = state => navigateTo({\n path: getRootLocation(),\n state\n });\n\n //Переход к панели\n const navigatePanel = (panel, state) => {\n if (panel) {\n let path = getRootLocation();\n path = !path.endsWith(\"/\") && !panel.url.startsWith(\"/\") ? `${path}/${panel.url}` : `${path}${panel.url}`;\n navigateTo({\n path,\n state\n });\n } else return false;\n };\n\n //Переход к панели по наименованию\n const navigatePanelByName = (name, state) => navigatePanel(findPanelByName(name), state);\n\n //Переход к произвольному адресу\n const navigateURL = url => {\n window.open(url, \"_self\");\n };\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(NavigationCtx.Provider, {\n value: {\n getNavigationSearch,\n isNavigationSearch,\n getNavigationState,\n isNavigationState,\n refresh,\n navigateTo,\n navigateBack,\n navigateRoot,\n navigatePanel,\n navigatePanelByName,\n navigateURL\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста навигации\nNavigationContext.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/navigation.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NavigationContext: () => (/* binding */ NavigationContext),\n/* harmony export */ NavigationCtx: () => (/* binding */ NavigationCtx),\n/* harmony export */ getRootLocation: () => (/* binding */ getRootLocation)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var query_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! query-string */ \"./node_modules/query-string/index.js\");\n/* harmony import */ var _application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./application */ \"./app/context/application.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Навигация\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Роутер приложения\n //Работа со строкой запроса\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Типовые пути\nconst PATHS = {\n ROOT: \"/\" //Корень приложения\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Получение корневого пути\nconst getRootLocation = () => PATHS.ROOT;\n\n//Контекст навигации\nconst NavigationCtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста навигации\nconst NavigationContext = ({\n children\n}) => {\n //Подключение к объекту роутера для управления навигацией\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useLocation)();\n\n //Подключение к объекту роутера для управления навигацией\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_3__.useNavigate)();\n\n //Подключение к контексту приложения\n const {\n findPanelByName\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Проверка наличия параметров запроса\n const isNavigationSearch = () => location.search ? true : false;\n\n //Считываение параметров запроса\n const getNavigationSearch = () => query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].parse(location.search);\n\n //Проверка наличия параметров запроса (передаваемых через состояние)\n const isNavigationState = () => location.state ? true : false;\n\n //Считываение параметров запроса (передаваемых через состояние)\n const getNavigationState = () => isNavigationState() ? JSON.parse(location.state) : null;\n\n //Обновление текущей страницы\n const refresh = () => window.location.reload();\n\n //Возврат на предыдущую страницу\n const navigateBack = () => navigate(-1);\n\n //Переход к адресу внутри приложения\n const navigateTo = ({\n path,\n search,\n state,\n replace = false\n }) => {\n //Если указано куда переходить\n if (path) {\n //Переходим к адресу\n if (state) navigate(path, {\n state: JSON.stringify(state),\n replace\n });else navigate({\n pathname: path,\n search: query_string__WEBPACK_IMPORTED_MODULE_1__[\"default\"].stringify(search),\n replace\n });\n //Флаг успешного перехода\n return true;\n }\n //Переход не состоялся\n else return false;\n };\n\n //Переход к домашней страничке\n const navigateRoot = state => navigateTo({\n path: getRootLocation(),\n state\n });\n\n //Переход к панели\n const navigatePanel = (panel, state) => {\n if (panel) {\n let path = getRootLocation();\n path = !path.endsWith(\"/\") && !panel.url.startsWith(\"/\") ? `${path}/${panel.url}` : `${path}${panel.url}`;\n navigateTo({\n path,\n state\n });\n } else return false;\n };\n\n //Переход к панели по наименованию\n const navigatePanelByName = (name, state) => navigatePanel(findPanelByName(name), state);\n\n //Переход к произвольному адресу\n const navigateURL = url => {\n window.open(url, \"_self\");\n };\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(NavigationCtx.Provider, {\n value: {\n getNavigationSearch,\n isNavigationSearch,\n getNavigationState,\n isNavigationState,\n refresh,\n navigateTo,\n navigateBack,\n navigateRoot,\n navigatePanel,\n navigatePanelByName,\n navigateURL\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста навигации\nNavigationContext.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/navigation.js?"); /***/ }), @@ -3359,7 +3249,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/*\n Парус 8 - Панели мониторинга\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (isArray) opts.isArray = isArray;\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(responseJSON.XRESPOND);\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false),\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\nconst ERR_UNAUTH = \"Сеанс завершен. Пройдите аутентификацию повторно.\"; //Ошибка аутентификации\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGROUPS\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (isArray) opts.isArray = isArray;\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Проверим на наличие редиректа к аутентификации (возникает, если сеанс окончен)\n if (response.redirected && response.url.toLowerCase().includes(\"auth?returnurl\")) throw new Error(ERR_UNAUTH);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(responseJSON.XRESPOND);\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false),\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); /***/ }), @@ -3370,7 +3260,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\n Парус 8 - Панели мониторинга\n Ядро: Вспомогательные функции\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); /***/ }), @@ -3381,29 +3271,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"./node_modules/react-dom/client.js\");\n/* harmony import */ var _root__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./root */ \"./app/root.js\");\n/*\n Парус 8 - Панели мониторинга\n Точка входа в приложение\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //React\n //Работа с DOM в React\n //Корневой компонент приложения\n\n//-----------\n//Точка входа\n//-----------\n\nconst root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(document.getElementById(\"app-content\"));\nroot.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_root__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/index.js?"); - -/***/ }), - -/***/ "./app/panels/alex/alex.js": -/*!*********************************!*\ - !*** ./app/panels/alex/alex.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Alex: () => (/* binding */ Alex)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/*\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\n Панель мониторинга: Описание макета (пользовательская инструкция)\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Текстовые ресурсы\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n IMG_CONT: {\n textAlign: \"center\",\n padding: \"10px\"\n },\n IMG: {\n maxWidth: \"100%\",\n height: \"auto\"\n },\n PRGF_TABLE: {\n paddingTop: \"20px\",\n paddingBottom: \"20px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n TABLE: {\n width: \"80%\"\n },\n TABLE_TITLE: {\n backgroundColor: \"lightgray\"\n },\n TABLE_SUBTITLE: {\n textAlign: \"center\",\n backgroundColor: \"#f3eded\",\n fontWeight: \"bold\"\n },\n FAB_BACK: {\n position: \"absolute\",\n right: \"20px\",\n marginTop: \"20px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst Alex = () => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"1234\");\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/alex/alex.js?"); - -/***/ }), - -/***/ "./app/panels/alex/index.js": -/*!**********************************!*\ - !*** ./app/panels/alex/index.js ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _alex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./alex */ \"./app/panels/alex/alex.js\");\n/*\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\n Панель мониторинга: Описание макета (пользовательская инструкция)\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель пользовательской инструкции\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _alex__WEBPACK_IMPORTED_MODULE_0__.Alex;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/alex/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ \"./node_modules/react-dom/client.js\");\n/* harmony import */ var _root__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./root */ \"./app/root.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Точка входа в приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //React\n //Работа с DOM в React\n //Корневой компонент приложения\n\n//-----------\n//Точка входа\n//-----------\n\nconst root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(document.getElementById(\"app-content\"));\nroot.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_root__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/index.js?"); /***/ }), @@ -3429,6 +3297,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./app/panels/eqs_prfrm/eqs_prfrm.js": +/*!*******************************************!*\ + !*** ./app/panels/eqs_prfrm/eqs_prfrm.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"\\u0412\\u044B\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D\\u0438\\u0435 \\u0440\\u0430\\u0431\\u043E\\u0442 \\u0422\\u041E\\u0438\\u0420\");\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); + +/***/ }), + +/***/ "./app/panels/eqs_prfrm/index.js": +/*!***************************************!*\ + !*** ./app/panels/eqs_prfrm/index.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _eqs_prfrm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./eqs_prfrm */ \"./app/panels/eqs_prfrm/eqs_prfrm.js\");\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель выполнения работ\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _eqs_prfrm__WEBPACK_IMPORTED_MODULE_0__.EqsPrfrm;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/index.js?"); + +/***/ }), + /***/ "./app/panels/mech_rec_cost_prod_plans/hooks.js": /*!******************************************************!*\ !*** ./app/panels/mech_rec_cost_prod_plans/hooks.js ***! @@ -3436,7 +3326,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlans: () => (/* binding */ useFilteredPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nconst useFilteredPlans = (plans, filter) => {\n const filteredPlans = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlans: () => (/* binding */ useFilteredPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор загруженных планов по поисковой фразе\nconst useFilteredPlans = (plans, filter) => {\n const filteredPlans = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); /***/ }), @@ -3451,17 +3341,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js": -/*!******************************************************************************!*\ - !*** ./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans copy.js ***! - \******************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//Список проектов\nconst ProjectsList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PROJECTS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n })\n })))));\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanCurLevel: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanCurLevel: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanCurLevel: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (curMaxLevel = null, level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n let maxLevel = curMaxLevel ? curMaxLevel : 0;\n //Если есть данные\n if (data.XGANTT_TASKS) {\n //Обходим данные\n data.XGANTT_TASKS.forEach(el => {\n // Если есть зависимости\n if (el.dependencies) {\n //Разбиваем их в array\n el.dependencies = el.dependencies[0].split(\",\");\n }\n //Если уровень больше рассчитанного максимального\n maxLevel = maxLevel < el.level ? el.level : maxLevel;\n });\n }\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: maxLevel,\n selectedPlanCurLevel: level || level === 0 ? level : maxLevel,\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(data?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(state.selectedPlanMaxLevel, selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanCurLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanCurLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanCurLevel\n }, [...Array(state.selectedPlanMaxLevel + 1).keys()].map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans_copy.js?"); - -/***/ }), - /***/ "./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js": /*!*************************************************************************!*\ !*** ./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js ***! @@ -3469,95 +3348,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//Список проектов\nconst ProjectsList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PROJECTS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n })\n })))));\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Разбор XML\nconst parseXML = (xmlDoc, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__.XMLParser(opts);\n const data = parser.parse(xmlDoc);\n resolve(data.XDATA);\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseXML(data.COUT, (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val);\n console.log(doc.XGANTT_DEF);\n console.log(doc.XGANTT_TASKS);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/TabsElements/agentChart.js": -/*!************************************************************!*\ - !*** ./app/panels/prj_agn_info/TabsElements/agentChart.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentChart: () => (/* binding */ AgentChart)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable react/prop-types */\n\n //Интерфейсные элементы\n //График\n\nconst AgentChart = ({\n chart,\n pOnlineShowUnit\n}) => {\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n pOnlineShowUnit({\n unitCode: \"PayNotes\",\n showMethod: \"SelectList\",\n inputParameters: [{\n name: item.SCOND,\n value: item.NIDENT\n }]\n });\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, chart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__.P8PChart, _extends({}, chart, {\n onClick: handleChartClick,\n style: {\n minWidth: \"40vw\",\n maxHeight: \"30vw\",\n minHeight: \"405px\",\n display: \"flex\",\n justifyContent: \"center\"\n }\n })) : null));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/TabsElements/agentChart.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/TabsElements/agentContracts.js": -/*!****************************************************************!*\ - !*** ./app/panels/prj_agn_info/TabsElements/agentContracts.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentContracts: () => (/* binding */ AgentContracts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../config_wrapper */ \"./app/config_wrapper.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable react/prop-types */\n\n //Интерфейсные элементы\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n\nconst AgentContracts = ({\n dataGrid,\n setDataGrid,\n pOnlineShowDocument\n}) => {\n //Генерация представления ячейки c данными\n const dataCellRender = ({\n row,\n columnDef\n }) => {\n switch (columnDef.name) {\n case \"NDOC_SUM\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"Contracts\",\n document: row[\"NRN\"]\n })\n }, row[columnDef.name])\n };\n }\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n textAlign: \"center\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n dataCellRender: dataCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n }))))));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/TabsElements/agentContracts.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/TabsElements/agentInfo.js": -/*!***********************************************************!*\ - !*** ./app/panels/prj_agn_info/TabsElements/agentInfo.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentInfo: () => (/* binding */ AgentInfo)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* eslint-disable react/prop-types */\n\n //Интерфейсные элементы\n\nconst makeInfoByCond = (blockName, infoValue) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, infoValue ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n variant: \"body2\",\n component: \"div\",\n sx: {\n textAlign: \"justify\",\n paddingTop: \"5px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, blockName, \":\"), \" \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), infoValue) : null);\n};\nconst AgentInfo = ({\n agentInfo,\n pOnlineShowDocument\n}) => {\n //При нажатии перехода на контрагента\n const handleAgnetClick = id => pOnlineShowDocument({\n unitCode: \"AGNLIST\",\n document: id\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n minHeight: \"510px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: {\n minHeight: \"457px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n variant: \"h5\",\n component: \"div\",\n sx: {\n fontSize: 16,\n fontWeight: \"bold\"\n },\n gutterBottom: true\n }, agentInfo.AGNNAME), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: {\n display: \"flex\",\n alignItems: \"flex-end\",\n flexDirection: \"column\",\n bgcolor: \"background.paper\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null, \"\\u0418\\u041D\\u041D: \", agentInfo.AGNIDNUMB), agentInfo.ORGCODE ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null, \"\\u041E\\u041A\\u041F\\u041E: \", agentInfo.ORGCODE) : null), makeInfoByCond(\"Мнемокод\", agentInfo.AGNABBR), makeInfoByCond(\"Наименование\", agentInfo.AGNNAME), makeInfoByCond(\"Полное наименование\", agentInfo.FULLNAME), makeInfoByCond(\"Адрес\", agentInfo.ADDRESS)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n alignItems: \"flex-end\",\n justifyContent: \"flex-end\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"contained\",\n onClick: () => handleAgnetClick(agentInfo.NRN)\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0439\\u0442\\u0438 \\u043A \\u043A\\u043E\\u043D\\u0442\\u0440\\u0430\\u0433\\u0435\\u043D\\u0442\\u0443\"))));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/TabsElements/agentInfo.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/back.js": -/*!*****************************************!*\ - !*** ./app/panels/prj_agn_info/back.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearSelectList: () => (/* binding */ clearSelectList),\n/* harmony export */ useAgent: () => (/* binding */ useAgent),\n/* harmony export */ useAgnlist: () => (/* binding */ useAgnlist),\n/* harmony export */ useTabs: () => (/* binding */ useTabs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n\n\nconst useAgnlist = executeStored => {\n //Список контрагентов\n const [agents, setAgents] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n const agentsGet = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async SREGEXP => {\n //Считываем список контрагентов\n const data = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGNLIST_GET\",\n args: {\n SREGEXP: SREGEXP\n },\n respArg: \"COUT\"\n });\n //Если есть данные\n if (data.AGENTS) {\n setAgents(data.AGENTS.length > 1 ? [...data.AGENTS] : [data.AGENTS]);\n } else {\n setAgents([]);\n }\n }, [executeStored]);\n return [agents, agentsGet];\n};\n\n//Информация о контрагенте\nconst useAgent = executeStored => {\n //Информация о контрагенте\n const [agentInfo, setAgentInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Инициализация информации о контрагенте\n const agentInfoGet = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n const data = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGNLIST_INFO_GET\",\n args: {\n NRN: NRN\n },\n respArg: \"COUT\"\n });\n //Устанавливаем информацию о контрагенте\n setAgentInfo(data.AGENT_INFO);\n }, [executeStored]);\n return [agentInfo, agentInfoGet];\n};\n\n//Информация для закладок\nconst useTabs = (executeStored, SERV_DATA_TYPE_CLOB) => {\n //Состояние для страницы договоров - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n NRN: null,\n dataLoaded: false,\n columnsDef: [],\n filters: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Состояние для страницы графиков - график\n const [chart, setChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n NRN: null,\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Размер страницы данных\n const DATA_GRID_PAGE_SIZE = 5;\n const agentContractsInit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n if (NRN && dataGrid.reload) {\n const data = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGENT_CONTRACTS_GET\",\n args: {\n NRN: NRN,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setDataGrid(pv => ({\n ...pv,\n NRN: NRN,\n filters: pv.filters,\n orders: pv.orders,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.pageNumber, dataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Загрузка данных графика с сервера\n const agentChartInit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n if (NRN && !chart.loaded) {\n const chart = await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.AGENT_CHART\",\n args: {\n NAGENT: NRN\n },\n respArg: \"COUT\"\n });\n setChart(pv => ({\n ...pv,\n loaded: true,\n ...chart.XCHART\n }));\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chart.loaded, executeStored]);\n\n //При изменении необходимости перезагрузки контрактов или рег. номера контрагента\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n agentContractsInit(dataGrid.NRN);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dataGrid.reload, dataGrid.NRN]);\n\n //При изменении необходимости перезагрузки графика или рег. номера контрагента\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n agentChartInit(chart.NRN);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chart.loaded, chart.NRN]);\n return [dataGrid, setDataGrid, chart, setChart, agentContractsInit, agentChartInit];\n};\n\n//Очистка селектлиста\nconst clearSelectList = async function (nAgentBefore, executeStored) {\n await executeStored({\n stored: \"UDO_PKG_P8PANELS_KOZLOV.CHART_SELECTLIST_CLEAR\",\n args: {\n NAGENT: nAgentBefore\n }\n });\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/back.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/index.js": -/*!******************************************!*\ - !*** ./app/panels/prj_agn_info/index.js ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _prj_agn_info__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prj_agn_info */ \"./app/panels/prj_agn_info/prj_agn_info.js\");\n/*\r\n Парус 8 - Панели мониторинга - Информация по контрагенту (вебинар)\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Информация по контрагенту (вебинар)\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _prj_agn_info__WEBPACK_IMPORTED_MODULE_0__.PrjAgnInfo;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/index.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/prj_agn_info.js": -/*!*************************************************!*\ - !*** ./app/panels/prj_agn_info/prj_agn_info.js ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjAgnInfo: () => (/* binding */ PrjAgnInfo)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _tabs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tabs */ \"./app/panels/prj_agn_info/tabs.js\");\n/* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./back */ \"./app/panels/prj_agn_info/back.js\");\n/*\r\n Парус 8 - Панели мониторинга - Информация по контрагенту (вебинар)\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Интерфейсные элементы\n\n\n\n//Стили\nconst STYLES = {\n MAIN: {\n border: \"3px solid rgba(0, 0, 0,.5)\",\n minHeight: \"625px\",\n minWidth: \"1200px\"\n },\n // , justifyContent: \"space-around\"\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\",\n margin: \"0px 100px\",\n maxWidth: \"2000px\"\n },\n AGNLIST: {\n maxWidth: \"300px\",\n padding: \"16px 25px\"\n },\n AGNINFO: {\n borderLeft: \"3px solid rgba(0, 0, 0,.5)\"\n },\n FINDBUTTON: {\n marginTop: \"10px\"\n },\n TITLE: {\n paddingBottom: \"40px\"\n },\n LIST: {\n width: \"100%\",\n maxWidth: \"600px\",\n bgcolor: \"background.paper\"\n },\n LISTITEM: {\n textAlign: \"left\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjAgnInfo = () => {\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit,\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Собственное состояние - список контрагентов\n const [agents, agentsGet] = (0,_back__WEBPACK_IMPORTED_MODULE_4__.useAgnlist)(executeStored);\n\n //Собственное состояние - форма поиска контрагента\n const [agentsFind, setAgentsFind] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Собственное состояние - информация о контрагенте\n const [agentInfo, agentInfoGet] = (0,_back__WEBPACK_IMPORTED_MODULE_4__.useAgent)(executeStored);\n\n //При вводе значения в форме поиска\n const handleAgentsFindText = e => {\n //Устанавливаем фильтр контрагентов\n setAgentsFind(e.target.value);\n };\n\n //При нажатии кнопки поиска\n const handleAgentsFindBtn = () => {\n //Получаем список контрагентов\n agentsGet(agentsFind);\n };\n\n //При нажатии на контрагента\n const handleAgnetClick = id => {\n //Если есть информация о прошлом контрагенте\n if (agentInfo.NRN) {\n (0,_back__WEBPACK_IMPORTED_MODULE_4__.clearSelectList)(agentInfo.NRN, executeStored);\n }\n //Получаем информацию о контрагенте\n agentInfoGet(id);\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Получаем список контрагентов\n agentsGet(null, executeStored);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, \"\\u0418\\u043D\\u0444\\u043E\\u0440\\u043C\\u0430\\u0446\\u0438\\u044F \\u043E \\u043A\\u043E\\u043D\\u0442\\u0440\\u0430\\u0433\\u0435\\u043D\\u0442\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n container: true,\n spacing: 2,\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: true,\n xs: 4,\n style: STYLES.AGNLIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n name: \"mnemo\",\n label: \"\\u041C\\u043D\\u0435\\u043C\\u043E\\u043A\\u043E\\u0434\",\n value: agentsFind,\n variant: \"standard\",\n fullWidth: true,\n onChange: handleAgentsFindText\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n style: STYLES.FINDBUTTON,\n onClick: handleAgentsFindBtn,\n variant: \"contained\",\n fullWidth: true\n }, \"\\u0418\\u0441\\u043A\\u0430\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.LIST\n }, agents.map(a => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: a.NRN,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: () => handleAgnetClick(a.NRN)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: a.SAGNABBR\n })))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: true,\n container: true,\n xs: true,\n style: STYLES.AGNINFO\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_tabs__WEBPACK_IMPORTED_MODULE_3__.BasicTabs, {\n agentInfo: agentInfo,\n pOnlineShowUnit: pOnlineShowUnit,\n pOnlineShowDocument: pOnlineShowDocument,\n executeStored: executeStored,\n SERV_DATA_TYPE_CLOB: SERV_DATA_TYPE_CLOB\n }))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/prj_agn_info.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/tabs.js": -/*!*****************************************!*\ - !*** ./app/panels/prj_agn_info/tabs.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BasicTabs: () => (/* binding */ BasicTabs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Tabs/Tabs.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Tab/Tab.js\");\n/* harmony import */ var _TabsElements_agentInfo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TabsElements/agentInfo */ \"./app/panels/prj_agn_info/TabsElements/agentInfo.js\");\n/* harmony import */ var _TabsElements_agentContracts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./TabsElements/agentContracts */ \"./app/panels/prj_agn_info/TabsElements/agentContracts.js\");\n/* harmony import */ var _TabsElements_agentChart__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TabsElements/agentChart */ \"./app/panels/prj_agn_info/TabsElements/agentChart.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ \"./app/panels/prj_agn_info/utils.js\");\n/* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./back */ \"./app/panels/prj_agn_info/back.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/* eslint-disable react/prop-types */\n\n\n //Интерфейсные элементы\n\n\n\n\n\nfunction CustomTabPanel(props) {\n const {\n children,\n value,\n index,\n ...other\n } = props;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", _extends({\n role: \"tabpanel\",\n hidden: value !== index,\n id: `simple-tabpanel-${index}`,\n \"aria-labelledby\": `simple-tab-${index}`\n }, other), value === index && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: {\n p: 3\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, children)));\n}\nCustomTabPanel.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().node),\n index: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number).isRequired,\n value: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number).isRequired\n};\nfunction a11yProps(index) {\n return {\n id: `simple-tab-${index}`,\n \"aria-controls\": `simple-tabpanel-${index}`\n };\n}\nconst BasicTabs = ({\n agentInfo,\n pOnlineShowUnit,\n pOnlineShowDocument,\n executeStored,\n SERV_DATA_TYPE_CLOB\n}) => {\n //Собственное состояние - информация о контрактах и графике\n const [dataGrid, setDataGrid, chart, setChart] = (0,_back__WEBPACK_IMPORTED_MODULE_5__.useTabs)(executeStored, SERV_DATA_TYPE_CLOB);\n //Собствественное состояние - Текущая страница\n const [value, setValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n\n //При изменении страницы\n const handleChange = (event, newValue) => {\n setValue(newValue);\n };\n\n //Эффект на изменение контрагента\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setDataGrid(pv => ({\n ...pv,\n NRN: agentInfo.NRN,\n pageNumber: 1,\n reload: true\n }));\n setChart(pv => ({\n ...pv,\n NRN: agentInfo.NRN,\n loaded: false\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentInfo]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: {\n width: \"100%\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: {\n borderBottom: 1,\n borderColor: \"divider\",\n marginRight: \"24px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n value: value,\n onChange: handleChange,\n \"aria-label\": \"basic tabs example\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _extends({\n label: \"\\u041A\\u0430\\u0440\\u0442\\u043E\\u0447\\u043A\\u0430\"\n }, a11yProps(0))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _extends({\n label: \"\\u0414\\u043E\\u0433\\u043E\\u0432\\u043E\\u0440\\u044B\"\n }, a11yProps(1))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _extends({\n label: \"\\u041F\\u043B\\u0430\\u0442\\u0435\\u0436\\u0438\"\n }, a11yProps(2))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTabPanel, {\n value: value,\n index: 0\n }, agentInfo.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabsElements_agentInfo__WEBPACK_IMPORTED_MODULE_1__.AgentInfo, {\n agentInfo: agentInfo,\n pOnlineShowDocument: pOnlineShowDocument\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_utils__WEBPACK_IMPORTED_MODULE_4__.AgentNotSelected, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTabPanel, {\n value: value,\n index: 1\n }, agentInfo.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabsElements_agentContracts__WEBPACK_IMPORTED_MODULE_2__.AgentContracts, {\n dataGrid: dataGrid,\n setDataGrid: setDataGrid,\n pOnlineShowDocument: pOnlineShowDocument\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_utils__WEBPACK_IMPORTED_MODULE_4__.AgentNotSelected, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTabPanel, {\n value: value,\n index: 2\n }, agentInfo.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabsElements_agentChart__WEBPACK_IMPORTED_MODULE_3__.AgentChart, {\n chart: chart,\n pOnlineShowUnit: pOnlineShowUnit\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_utils__WEBPACK_IMPORTED_MODULE_4__.AgentNotSelected, null)));\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/tabs.js?"); - -/***/ }), - -/***/ "./app/panels/prj_agn_info/utils.js": -/*!******************************************!*\ - !*** ./app/panels/prj_agn_info/utils.js ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AgentNotSelected: () => (/* binding */ AgentNotSelected)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nconst AgentNotSelected = () => {\n //Если контрагент не выбран - сообщаем */\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, \"\\u041A\\u043E\\u043D\\u0442\\u0440\\u0430\\u0433\\u0435\\u043D\\u0442 \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D.\");\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_agn_info/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = xmlDoc => {\n return new Promise((resolve, reject) => {\n try {\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__.XMLParser({\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\",\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val\n });\n const data = parser.parse(xmlDoc);\n resolve(data.XDATA);\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Список планов\nconst PlansList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), @@ -3638,6 +3429,39 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./app/panels/prj_graph/index.js": +/*!***************************************!*\ + !*** ./app/panels/prj_graph/index.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RootClass: () => (/* binding */ RootClass)\n/* harmony export */ });\n/* harmony import */ var _prj_graph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prj_graph */ \"./app/panels/prj_graph/prj_graph.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель графиков проекта\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _prj_graph__WEBPACK_IMPORTED_MODULE_0__.PrjGraph;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/index.js?"); + +/***/ }), + +/***/ "./app/panels/prj_graph/layouts.js": +/*!*****************************************!*\ + !*** ./app/panels/prj_graph/layouts.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n\n//---------\n//Константы\n//---------\n\n//Шаблон имени ячейки месяца\nconst MONTH_COLUMN_REG_EXP = /[0-9]{4}_[0-9]{1,2}/;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Формирование значения для плашки этапа\nconst formatStageItemValue = (state, text) => {\n const [stateText, icon] = state == 0 ? [\"Зарегистрирован\", \"app_registration\"] : state == 1 ? [\"Открыт\", \"lock_open\"] : state == 2 ? [\"Закрыт\", \"lock_outline\"] : state == 3 ? [\"Согласован\", \"thumb_up_alt\"] : state == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: stateText\n }, icon), text);\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = ({\n group,\n pOnlineShowDocument\n}) => ({\n cellStyle: {\n padding: \"2px\"\n },\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"Projects\",\n document: group.name\n })\n }, group.caption)\n});\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef,\n pOnlineShowDocument\n}) => {\n if (MONTH_COLUMN_REG_EXP.test(columnDef.name)) {\n const dF = new Date(row.DFROM);\n const dT = new Date(row.DTO);\n const [year, month] = columnDef.name.split(\"_\");\n const mF = new Date(year, month - 1, 1);\n const mT = new Date(year, month, 0);\n let cellStyle = {};\n let cellProps = {};\n let data = null;\n if (dF <= mF && dT >= mT || dF >= mF && dF <= mT || dT >= mF && dT <= mT) {\n if (year == dF.getFullYear() && month == dF.getMonth() + 1) data = formatStageItemValue(row.NSTATE, row.SRESP);\n cellStyle = {\n backgroundColor: row.NSTATE == 0 ? \"lightyellow\" : row.NSTATE == 1 ? \"lightgreen\" : \"lightblue\",\n cursor: \"pointer\"\n };\n cellProps = {\n title: `${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(dF)} - ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(dT)}`,\n onClick: () => pOnlineShowDocument({\n unitCode: \"ProjectsStages\",\n document: row.NRN\n })\n };\n }\n return {\n cellStyle: {\n padding: \"2px\",\n maxWidth: \"30px\",\n overflow: \"visible\",\n fontSize: \"smaller\",\n whiteSpace: \"nowrap\",\n ...cellStyle\n },\n cellProps,\n data\n };\n }\n switch (columnDef.name) {\n case \"SJOB\":\n return {\n cellProps: {\n title: row[columnDef.name]\n },\n cellStyle: {\n padding: \"2px\",\n maxWidth: \"300px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\",\n fontSize: \"smaller\"\n }\n };\n }\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/layouts.js?"); + +/***/ }), + +/***/ "./app/panels/prj_graph/prj_graph.js": +/*!*******************************************!*\ + !*** ./app/panels/prj_graph/prj_graph.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjGraph: () => (/* binding */ PrjGraph)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_graph/layouts.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Панель мониторинга: Корневая панель графиков проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст приложения\n //Контекст взаимодействия с сервером\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Графики проектов\nconst PrjGraph = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: true\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.GRAPH\",\n args: {},\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.dataCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_5__.groupCellRender)({\n ...prms,\n pOnlineShowDocument\n })\n })) : null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/prj_graph.js?"); + +/***/ }), + /***/ "./app/panels/prj_help/index.js": /*!**************************************!*\ !*** ./app/panels/prj_help/index.js ***! @@ -3700,7 +3524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n console.log(data);\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), @@ -3733,7 +3557,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = () => ({\n cellStyle: {\n padding: \"2px\"\n }\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n groups: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n groups: pv.pageNumber == 1 ? [...(data.XGROUPS || [])] : [...pv.groups, ...(data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name)) || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); /***/ }), @@ -3821,7 +3645,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app */ \"./app/app.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../app.config */ \"./app.config.js\");\n/* harmony import */ var _core_client__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./core/client */ \"./app/core/client.js\");\n/*\n Парус 8 - Панели мониторинга\n Корневой класс приложения (обёртка для контекста)\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст сообщений\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Приложение\n //Текстовые ресурсы и константы\n //Вспомогательные функции\n //Настройки приложения\n //Клиент для взаимодействия с сервером\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для контекста\nconst Root = () => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_messaging__WEBPACK_IMPORTED_MODULE_1__.MessagingContext, {\n titles: _app_text__WEBPACK_IMPORTED_MODULE_5__.TITLES,\n texts: _app_text__WEBPACK_IMPORTED_MODULE_5__.TEXTS,\n buttons: _app_text__WEBPACK_IMPORTED_MODULE_5__.BUTTONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_backend__WEBPACK_IMPORTED_MODULE_2__.BackEndContext, {\n client: _core_client__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_application__WEBPACK_IMPORTED_MODULE_3__.ApplicationContext, {\n errors: _app_text__WEBPACK_IMPORTED_MODULE_5__.ERRORS,\n displaySizeGetter: _core_utils__WEBPACK_IMPORTED_MODULE_6__.getDisplaySize,\n guidGenerator: _core_utils__WEBPACK_IMPORTED_MODULE_6__.genGUID,\n config: _app_config__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_app__WEBPACK_IMPORTED_MODULE_4__.App, null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Root);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/root.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./context/application */ \"./app/context/application.js\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app */ \"./app/app.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../app.config */ \"./app.config.js\");\n/* harmony import */ var _core_client__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./core/client */ \"./app/core/client.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Корневой класс приложения (обёртка для контекста)\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст сообщений\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Приложение\n //Текстовые ресурсы и константы\n //Вспомогательные функции\n //Настройки приложения\n //Клиент для взаимодействия с сервером\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для контекста\nconst Root = () => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_messaging__WEBPACK_IMPORTED_MODULE_1__.MessagingContext, {\n titles: _app_text__WEBPACK_IMPORTED_MODULE_5__.TITLES,\n texts: _app_text__WEBPACK_IMPORTED_MODULE_5__.TEXTS,\n buttons: _app_text__WEBPACK_IMPORTED_MODULE_5__.BUTTONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_backend__WEBPACK_IMPORTED_MODULE_2__.BackEndContext, {\n client: _core_client__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context_application__WEBPACK_IMPORTED_MODULE_3__.ApplicationContext, {\n errors: _app_text__WEBPACK_IMPORTED_MODULE_5__.ERRORS,\n displaySizeGetter: _core_utils__WEBPACK_IMPORTED_MODULE_6__.getDisplaySize,\n guidGenerator: _core_utils__WEBPACK_IMPORTED_MODULE_6__.genGUID,\n config: _app_config__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_app__WEBPACK_IMPORTED_MODULE_4__.App, null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Root);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/root.js?"); /***/ }), -- 2.34.1 From a90071afe880ac3ba5bce744787b06381ab74687 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 14 Feb 2024 13:03:10 +0300 Subject: [PATCH 08/27] =?UTF-8?q?=D0=91=D0=94:=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20CLOB-=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=B2=20PG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_BASE.pck | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck index 4a3098a..900e224 100644 --- a/db/PKG_P8PANELS_BASE.pck +++ b/db/PKG_P8PANELS_BASE.pck @@ -698,12 +698,14 @@ create or replace package body PKG_P8PANELS_BASE as SARG_NAME := PKG_CONTPRMLOC.FIRST_(RCONTAINER => ARGS_VALS); while (SARG_NAME is not null) loop - /* Считываем очередной параметр */ + /* Считываем значение параметра */ RARG_VAL := PKG_CONTPRMLOC.GET(RCONTAINER => ARGS_VALS, SNAME => SARG_NAME); + /* Считываем описание параметра */ + RARG := PKG_OBJECT_DESC.FETCH_ARGUMENT(RARGUMENTS => ARGS, SARGUMENT_NAME => SARG_NAME); /* Если это выходной параметр */ - if (RARG_VAL.IN_OUT in (PKG_STD.PARAM_TYPE_IN_OUT, PKG_STD.PARAM_TYPE_OUT)) then + if (RARG.IN_OUT in (PKG_STD.PARAM_TYPE_IN_OUT, PKG_STD.PARAM_TYPE_OUT)) then /* Сформируем для него значение в зависимости от его типа */ - case RARG_VAL.DATA_TYPE + case RARG.DATA_TYPE /* Строка */ when PKG_STD.DATA_TYPE_STR then RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP, -- 2.34.1 From 106388d4c8df5b637ef9487c385899da2be36fac Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 14 Feb 2024 13:06:31 +0300 Subject: [PATCH 09/27] =?UTF-8?q?WEB=20APP:=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=B2=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20xml?= =?UTF-8?q?2JSON,=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20"=D0=9F?= =?UTF-8?q?=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/utils.js | 34 +++++++++++++++++-- .../mech_rec_cost_prod_plans.js | 24 ++++--------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/app/core/utils.js b/app/core/utils.js index 3ebd3d4..69492d1 100644 --- a/app/core/utils.js +++ b/app/core/utils.js @@ -7,7 +7,7 @@ //Подключение библиотек //--------------------- -import { XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML +import { XMLParser, XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML import dayjs from "dayjs"; //Работа с датами //--------- @@ -56,6 +56,26 @@ const object2Base64XML = (obj, builderOptions) => { return btoa(unescape(encodeURIComponent(builder.build(obj)))); }; +//Конвертация XML в JSON +const xml2JSON = ({ xmlDoc, attributeValueProcessor, isArray }) => { + return new Promise((resolve, reject) => { + try { + let opts = { + ignoreDeclaration: true, + ignoreAttributes: false, + parseAttributeValue: true, + attributeNamePrefix: "" + }; + if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor; + if (isArray) opts.isArray = isArray; + const parser = new XMLParser(opts); + resolve(parser.parse(xmlDoc)); + } catch (e) { + reject(e); + } + }); +}; + //Форматирование даты в формат РФ const formatDateRF = value => (value ? dayjs(value).format("DD.MM.YYYY") : null); @@ -75,4 +95,14 @@ const genGUID = () => //Интерфейс модуля //---------------- -export { hasValue, getDisplaySize, deepCopyObject, object2Base64XML, formatDateRF, formatDateJSONDateOnly, formatNumberRFCurrency, genGUID }; +export { + hasValue, + getDisplaySize, + deepCopyObject, + object2Base64XML, + xml2JSON, + formatDateRF, + formatDateJSONDateOnly, + formatNumberRFCurrency, + genGUID +}; 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 10fd417..0218ff8 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 @@ -15,9 +15,8 @@ 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 { xml2JSON, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки -import { XMLParser } from "fast-xml-parser"; //--------- //Константы @@ -49,23 +48,12 @@ const STYLES = { //------------------------------------ //Разбор 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 parseProdPlanSpXML = async xmlDoc => { + const data = await xml2JSON({ + xmlDoc, + attributeValueProcessor: (name, val) => (name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val) }); + return data.XDATA; }; //Список планов -- 2.34.1 From 959c42bd0eb2aba77e99b6c2681855d868222e6e Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 14 Feb 2024 13:08:17 +0300 Subject: [PATCH 10/27] =?UTF-8?q?WEB=20APP:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2"=20-=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BC=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B2=D1=8B=D1=81=D0=BE=D1=82=D1=8B=20=D0=B4=D0=B8=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B,=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20=D1=81=20?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/prj_jobs/prj_jobs.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js index 999aab7..f9c4937 100644 --- a/app/panels/prj_jobs/prj_jobs.js +++ b/app/panels/prj_jobs/prj_jobs.js @@ -23,7 +23,7 @@ import { ResMon } from "./res_mon"; //Монитор ресурсов //--------- //Высота диаграммы Ганта -const GANTT_HEIGHT = "650px"; +const GANTT_HEIGHT = "75vh"; //Ширина диаграммы Ганта const GANTT_WIDTH = "98vw"; @@ -192,7 +192,8 @@ const PrjJobs = () => { const data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST", args: { NIDENT: state.ident }, - respArg: "COUT" + respArg: "COUT", + isArray: name => name === "XPROJECTS" }); setState(pv => ({ ...pv, projectsLoaded: true, projects: [...(data?.XPROJECTS || [])] })); } -- 2.34.1 From 2507ae5c69af7068a4791197e3cb33e05d9f180d Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 14 Feb 2024 13:08:36 +0300 Subject: [PATCH 11/27] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index c50afce..e6f2245 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3260,7 +3260,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML),\n/* harmony export */ xml2JSON: () => (/* binding */ xml2JSON)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Конвертация XML в JSON\nconst xml2JSON = ({\n xmlDoc,\n attributeValueProcessor,\n isArray\n}) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n if (isArray) opts.isArray = isArray;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); /***/ }), @@ -3348,7 +3348,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = xmlDoc => {\n return new Promise((resolve, reject) => {\n try {\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__.XMLParser({\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\",\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val\n });\n const data = parser.parse(xmlDoc);\n resolve(data.XDATA);\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Список планов\nconst PlansList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Список планов\nconst PlansList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), @@ -3524,7 +3524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), -- 2.34.1 From 012f799f74b1809e78c031ef230a61f5c8d48c6a Mon Sep 17 00:00:00 2001 From: Dollerino Date: Wed, 14 Feb 2024 15:18:50 +0300 Subject: [PATCH 12/27] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-794=20-=20=D0=94?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BB=D0=B8=20"=D0=9F=D1=80=D0=BE=D0=B8=D0=B7?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/mech_rec_cost_prod_plans/hooks.js | 10 +- .../mech_rec_cost_prod_plans.js | 233 ++++--- db/PKG_P8PANELS_MECHREC.pck | 629 +++++++++++------- 3 files changed, 536 insertions(+), 336 deletions(-) diff --git a/app/panels/mech_rec_cost_prod_plans/hooks.js b/app/panels/mech_rec_cost_prod_plans/hooks.js index 3cf45a9..926fc8a 100644 --- a/app/panels/mech_rec_cost_prod_plans/hooks.js +++ b/app/panels/mech_rec_cost_prod_plans/hooks.js @@ -14,10 +14,10 @@ import React from "react"; //Классы React //----------- //Клиентский отбор загруженных планов по поисковой фразе -export const useFilteredPlans = (plans, filter) => { - const filteredPlans = React.useMemo(() => { - return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter)); - }, [plans, filter]); +export const useFilteredPlanCtlgs = (planCtlgs, filter) => { + const filteredPlanCtlgs = React.useMemo(() => { + return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter)); + }, [planCtlgs, filter]); - return filteredPlans; + return filteredPlanCtlgs; }; 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 0218ff8..bb2a489 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 @@ -12,18 +12,21 @@ 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 { xml2JSON, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции -import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки +import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки //--------- //Константы //--------- +//Поля сортировки +const SORT_REP_DATE = "DREP_DATE"; +const SORT_REP_DATE_TO = "DREP_DATE_TO"; + //Высота диаграммы Ганта -const GANTT_HEIGHT = "650px"; +const GANTT_HEIGHT = "75vh"; //Ширина диаграммы Ганта const GANTT_WIDTH = "98vw"; @@ -56,8 +59,8 @@ const parseProdPlanSpXML = async xmlDoc => { return data.XDATA; }; -//Список планов -const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => { +//Список каталогов планов +const PlanCtlgsList = ({ planCtlgs = [], selectedPlanCtlg, filter, setFilter, onClick } = {}) => { //Генерация содержимого return (
@@ -73,9 +76,9 @@ const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {} }} > - {plans.map(p => ( - (onClick ? onClick(p) : null)}> - {p.SDOC_INFO}} /> + {planCtlgs.map(p => ( + (onClick ? onClick(p) : null)}> + {p.SNAME}} /> ))} @@ -83,10 +86,10 @@ const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {} ); }; -//Контроль свойств - Список планов -PlansList.propTypes = { - plans: PropTypes.array, - selectedPlan: PropTypes.number, +//Контроль свойств - Список каталогов планов +PlanCtlgsList.propTypes = { + planCtlgs: PropTypes.array, + selectedPlanCtlg: PropTypes.number, onClick: PropTypes.func, filter: PropTypes.string, setFilter: PropTypes.func @@ -102,23 +105,21 @@ const MechRecCostProdPlans = () => { let [state, setState] = useState({ init: false, showPlanList: false, - plans: [], - plansLoaded: false, - selectedPlanSpecsLoaded: false, - selectedPlan: null, - selectedPlanMaxLevel: null, - selectedPlanLevel: null, - selectedPlanMenuItems: null, - selectedPlanGanttDef: {}, - selectedPlanSpecs: [] + planCtlgs: [], + planCtlgsLoaded: false, + selectedPlanCtlgSpecsLoaded: false, + selectedPlanCtlg: null, + selectedPlanCtlgMaxLevel: null, + selectedPlanCtlgLevel: null, + selectedPlanCtlgSort: null, + selectedPlanCtlgMenuItems: null, + selectedPlanCtlgGanttDef: {}, + selectedPlanCtlgSpecs: [] }); const [filter, setFilter] = useState(""); - const filteredPlans = useFilteredPlans(state.plans, filter); - - //Подключение к контексту приложения - const { pOnlineShowDocument } = useContext(ApplicationСtx); + const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter); //Подключение к контексту сообщений const { InlineMsgInfo } = useContext(MessagingСtx); @@ -126,106 +127,110 @@ const MechRecCostProdPlans = () => { //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); - // Инициализация планов - const initPlans = useCallback(async () => { + // Инициализация каталогов планов + const initPlanCtlgs = useCallback(async () => { if (!state.init) { const data = await executeStored({ - stored: "PKG_P8PANELS_MECHREC.PRODPLAN_INIT", + stored: "PKG_P8PANELS_MECHREC.ACATALOG_INIT", args: {}, respArg: "COUT", - isArray: name => name === "XFCPRODPLANS" + isArray: name => name === "XFCPRODPLAN_CRNS" }); - setState(pv => ({ ...pv, init: true, plans: [...(data?.XFCPRODPLANS || [])], plansLoaded: true })); + setState(pv => ({ ...pv, init: true, planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])], planCtlgsLoaded: true })); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.init, executeStored]); - //Выбор плана + //Выбор каталога планов const selectPlan = project => { setState(pv => ({ ...pv, - selectedPlan: project, - selectedPlanSpecsLoaded: false, - selectedPlanMaxLevel: null, - selectedPlanLevel: null, - selectedPlanMenuItems: null, - selectedPlanSpecs: [], - selectedPlanGanttDef: {}, + selectedPlanCtlg: project, + selectedPlanCtlgSpecsLoaded: false, + selectedPlanCtlgMaxLevel: null, + selectedPlanCtlgLevel: null, + selectedPlanCtlgSort: null, + selectedPlanCtlgMenuItems: null, + selectedPlanCtlgSpecs: [], + selectedPlanCtlgGanttDef: {}, showPlanList: false })); }; - //Сброс выбора плана + //Сброс выбора каталога планов const unselectPlan = () => setState(pv => ({ ...pv, - selectedPlanSpecsLoaded: false, - selectedPlan: null, - selectedPlanMaxLevel: null, - selectedPlanLevel: null, - selectedPlanMenuItems: null, - selectedPlanSpecs: [], - selectedPlanGanttDef: {}, + selectedPlanCtlgSpecsLoaded: false, + selectedPlanCtlg: null, + selectedPlanCtlgMaxLevel: null, + selectedPlanCtlgLevel: null, + selectedPlanCtlgSort: null, + selectedPlanCtlgMenuItems: null, + selectedPlanCtlgSpecs: [], + selectedPlanCtlgGanttDef: {}, showPlanList: false })); - //Загрузка списка спецификаций плана - const loadPlanSpecs = useCallback( - async (level = null) => { + //Загрузка списка спецификаций каталога планов + const loadPlanCtglSpecs = useCallback( + async (level = null, sort = null) => { const data = await executeStored({ stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET", - args: { NFCPRODPLAN: state.selectedPlan, NLEVEL: level } + args: { NCRN: state.selectedPlanCtlg, NLEVEL: level, SSORT_FIELD: sort } }); let doc = await parseProdPlanSpXML(data.COUT); setState(pv => ({ ...pv, - selectedPlanMaxLevel: data.NMAX_LEVEL, - selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL, - selectedPlanMenuItems: state.selectedPlanMenuItems - ? state.selectedPlanMenuItems + selectedPlanCtlgMaxLevel: data.NMAX_LEVEL, + selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL, + selectedPlanCtlgSort: sort, + selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems + ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1), - selectedPlanSpecsLoaded: true, - selectedPlanGanttDef: doc.XGANTT_DEF ? { ...doc.XGANTT_DEF } : {}, - selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])] + selectedPlanCtlgSpecsLoaded: true, + selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? { ...doc.XGANTT_DEF } : {}, + selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])] })); }, // eslint-disable-next-line react-hooks/exhaustive-deps - [executeStored, state.ident, state.selectedPlan] + [executeStored, state.ident, state.selectedPlanCtlg] ); - //Обработка нажатия на элемент в списке планов + //Обработка нажатия на элемент в списке каталогов планов const handleProjectClick = project => { - if (state.selectedPlan != project.NRN) selectPlan(project.NRN); + if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN); else unselectPlan(); }; - //Отработка нажатия на заголовок плана - const handleTitleClick = () => { - state.selectedPlan ? pOnlineShowDocument({ unitCode: "CostProductPlans", document: state.selectedPlan }) : null; - }; - //При подключении компонента к странице useEffect(() => { - initPlans(); + initPlanCtlgs(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - //При смене выбранного плана + //При смене выбранного каталога плана useEffect(() => { - if (state.selectedPlan) loadPlanSpecs(); - }, [state.selectedPlan, loadPlanSpecs]); + if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO); + }, [state.selectedPlanCtlg, loadPlanCtglSpecs]); //Выбор уровня - const handleChangeSelectList = selectedLevel => { - loadPlanSpecs(selectedLevel); - setState(pv => ({ ...pv, selectedPlanLevel: selectedLevel })); + const handleChangeSelectLevel = selectedLevel => { + loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort); + setState(pv => ({ ...pv, selectedPlanCtlgLevel: selectedLevel })); + }; + + //Выбор сортировки + const handleChangeSelectSort = selectedSort => { + loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort); + setState(pv => ({ ...pv, selectedPlanCtlgSort: selectedSort })); }; //Генерация содержимого return ( setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> - Планы + Каталоги планов { onClose={() => setState(pv => ({ ...pv, showPlanList: false }))} sx={STYLES.PLANS_DRAWER} > - { {state.init == true ? ( - {state.selectedPlanSpecsLoaded ? ( - state.selectedPlanSpecs.length === 0 ? ( - + {state.selectedPlanCtlgSpecsLoaded ? ( + state.selectedPlanCtlgSpecs.length === 0 ? ( + ) : ( - {state.selectedPlanMaxLevel ? ( - - Уровень - { + handleChangeSelectSort(event.target.value); + }} + defaultValue={state.selectedPlanCtlgLevel} + > + + Дата выпуска - ))} - + + Дата запуска + + + + + До уровня + + - ) : null} + ) : // + null} ) - ) : !state.selectedPlan ? ( - + ) : !state.selectedPlanCtlg ? ( + ) : null} diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 1e01d67..5ce95c9 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -1,18 +1,19 @@ create or replace package PKG_P8PANELS_MECHREC as - + /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */ procedure FCPRODPLANSP_GET ( - NFCPRODPLAN in number, -- Рег. номер родителя - NLEVEL in number := null, -- Уровень отбора - COUT out clob, -- Список проектов - NMAX_LEVEL out number -- Максимальный уровень иерархии + NCRN in number, -- Рег. номер каталога + NLEVEL in number := null, -- Уровень отбора + SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки + COUT out clob, -- Список проектов + NMAX_LEVEL out number -- Максимальный уровень иерархии ); - /* Инициализация планов и отчетов производства изделий */ - procedure PRODPLAN_INIT + /* Инициализация каталогов раздела "Планы и отчеты производства изделий" */ + procedure ACATALOG_INIT ( - COUT out clob -- Список планов и отчетов производства изделий + COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий" ); end PKG_P8PANELS_MECHREC; @@ -27,15 +28,18 @@ create or replace package body PKG_P8PANELS_MECHREC as STEXT_COLOR_ORANGE constant PKG_STD.TSTRING := '#FF8C00'; -- Цвет текста для черной заливки (оранжевый) /* Константы - параметры отборов планов */ - NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа" - NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден" - SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния) + NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа" + NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден" + SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния) /* Константы - дополнительные атрибуты */ - STASK_ATTR_DEFRESLIZ constant PKG_STD.TSTRING := 'defresliz'; -- Дефицит запуска - STASK_ATTR_REL_FACT constant PKG_STD.TSTRING := 'rel_fact'; -- Выпуск факт - STASK_ATTR_DEFSTART constant PKG_STD.TSTRING := 'defstart'; -- Дефицит выпуска - STASK_ATTR_LEVEL constant PKG_STD.TSTRING := 'level'; -- Уровень + STASK_ATTR_PROD_ORDER constant PKG_STD.TSTRING := 'prod_order'; -- Заказ + STASK_ATTR_SUBDIV_DLVR constant PKG_STD.TSTRING := 'subdiv_dlvr'; -- Сдающее подразделение + STASK_ATTR_MAIN_QUANT constant PKG_STD.TSTRING := 'main_quant'; -- Выпуск + STASK_ATTR_DEFRESLIZ constant PKG_STD.TSTRING := 'defresliz'; -- Дефицит запуска + STASK_ATTR_REL_FACT constant PKG_STD.TSTRING := 'rel_fact'; -- Выпуск факт + STASK_ATTR_DEFSTART constant PKG_STD.TSTRING := 'defstart'; -- Дефицит выпуска + STASK_ATTR_LEVEL constant PKG_STD.TSTRING := 'level'; -- Уровень /* Формирование характеристик спецификации в Ганте */ procedure MAKE_GANT_ITEM @@ -51,10 +55,18 @@ create or replace package body PKG_P8PANELS_MECHREC as begin /* Если дефицит запуска <> 0 */ if (NDEFRESLIZ <> 0) then - /* Полностью красный */ - STASK_BG_COLOR := SBG_COLOR_RED; - STASK_BG_PROGRESS_COLOR := null; - NTASK_PROGRESS := null; + /* Если дефицит выпуска = 0 */ + if (NDEFSTART = 0) then + /* Полностью зеленый */ + STASK_BG_COLOR := SBG_COLOR_GREEN; + STASK_BG_PROGRESS_COLOR := null; + NTASK_PROGRESS := null; + else + /* Полностью красный */ + STASK_BG_COLOR := SBG_COLOR_RED; + STASK_BG_PROGRESS_COLOR := null; + NTASK_PROGRESS := null; + end if; else /* Если дефицит выпуска = 0 */ if (NDEFSTART = 0) then @@ -81,48 +93,10 @@ create or replace package body PKG_P8PANELS_MECHREC as end if; end MAKE_GANT_ITEM; - /* Считывание заголовка документа */ - function TITLE_GET - ( - NRN in number -- Рег. номер плана и отчета производства изделий - ) return varchar2 -- Заголовок для отображения - is - SRESULT PKG_STD.TSTRING; -- Заголовок для отображения - SDOC_INFO PKG_STD.TSTRING; -- Информация о документе - SJURPERSONS_CODE PKG_STD.TSTRING; -- Мнемокод принадлежности - SINS_DEPARTMENT_CODE PKG_STD.TSTRING; -- Мнемокод подразделения - begin - /* Считываем информацию из плана */ - begin - select D.DOCCODE || ', ' || trim(T.PREFIX) || '/' || trim(T.NUMB) || ', от ' || TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') DOC_INFO, - J.CODE, - SD.CODE - into SDOC_INFO, - SJURPERSONS_CODE, - SINS_DEPARTMENT_CODE - from FCPRODPLAN T, - DOCTYPES D, - JURPERSONS J, - INS_DEPARTMENT SD - where T.RN = NRN - and D.RN = T.DOCTYPE - and J.RN = T.JUR_PERS - and SD.RN = T.SUBDIV; - exception - when others then - return 'Нет информации.'; - end; - /* Формируем заголовок */ - SRESULT := 'План и отчет производства изделия "' || SDOC_INFO || '", принадлежность "' || SJURPERSONS_CODE || - '", подразделение "' || SINS_DEPARTMENT_CODE || '"'; - /* Возвращаем результат */ - return SRESULT; - end TITLE_GET; - - /* Считывание максимального уровня иерархии плана */ + /* Считывание максимального уровня иерархии плана по каталогу */ function PRODPLAN_MAX_LEVEL_GET ( - NPRODPLAN in number -- Рег. номер плана + NCRN in number -- Рег. номер каталога планов ) return number -- Максимальный уровень иерархии is NRESULT PKG_STD.TNUMBER; -- Максимальный уровень иерархии @@ -133,8 +107,31 @@ create or replace package body PKG_P8PANELS_MECHREC as into NRESULT from (select T.RN, T.UP_LEVEL - from FCPRODPLANSP T - where T.PRN = NPRODPLAN) TMP + from FCPRODPLAN P, + FCPRODPLANSP T, + FINSTATE FS + where P.CRN = NCRN + and P.CATEGORY = NFCPRODPLAN_CATEGORY + and P.STATUS = NFCPRODPLAN_STATUS + and FS.RN = P.TYPE + and FS.CODE = SFCPRODPLAN_TYPE + and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.AUTHID = UTILIZER) + and T.PRN = P.RN) TMP connect by prior TMP.RN = TMP.UP_LEVEL start with TMP.UP_LEVEL is null; exception @@ -185,12 +182,13 @@ create or replace package body PKG_P8PANELS_MECHREC as end if; end if; end FCPRODPLANSP_DATES_GET; - + /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */ procedure FCPRODPLANSP_GET ( - NFCPRODPLAN in number, -- Рег. номер родителя + NCRN in number, -- Рег. номер каталога NLEVEL in number := null, -- Уровень отбора + SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки COUT out clob, -- Список проектов NMAX_LEVEL out number -- Максимальный уровень иерархии ) @@ -205,149 +203,351 @@ create or replace package body PKG_P8PANELS_MECHREC as NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации + STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте + CSQL clob; -- Буфер для запроса + ICURSOR integer; -- Курсор для исполнения запроса + /* Значения спецификации */ + NTASK_RN PKG_STD.TREF; -- Рег. номер спецификации + NTASK_PRN PKG_STD.TREF; -- Рег. номер родителя спецификации + STASK_PROD_ORDER PKG_STD.TSTRING; -- Заказ + DTASK_REP_DATE PKG_STD.TLDATE; -- Дата запуска + DTASK_REP_DATE_TO PKG_STD.TLDATE; -- Дата выпуска + DTASK_INCL_DATE PKG_STD.TLDATE; -- Дата включения в план + STASK_ROUTE PKG_STD.TSTRING; -- Маршрут + STASK_NOMEN_NAME PKG_STD.TSTRING; -- Наименование номенклатуры + NTASK_DEFRESLIZ number; -- Дефицит запуска + NTASK_REL_FACT number; -- Выпуск факт + NTASK_DEFSTART number; -- Дефицит выпуска + NTASK_MAIN_QUANT number; -- Выпуск + STASK_SUBDIV_DLVR PKG_STD.TSTRING; -- Сдающее подразделение + NTASK_HAVE_LINK PKG_STD.TNUMBER; -- Наличие ссылок (0 - нет, 1 - да) + NTASK_UP_LEVEL PKG_STD.TREF; -- Рег. номер родительской записи в иерархии + NTASK_LEVEL PKG_STD.TNUMBER; -- Уровень в иерархии + + /* Объединение значений в строковое представление */ + function MAKE_INFO + ( + SPROD_ORDER in varchar2, -- Заказ + SNOMEN_NAME in varchar2, -- Наименование номенклатуры + SSUBDIV_DLVR in varchar2, -- Сдающее подразделение + NMAIN_QUANT in number -- Выпуск + ) return varchar2 -- Описание задачи в Ганте + is + SRESULT PKG_STD.TSTRING; -- Описание задачи в Ганте + begin + /* Соединяем информацию */ + SRESULT := STRCOMBINE(SPROD_ORDER, SNOMEN_NAME, ', '); + SRESULT := STRCOMBINE(SRESULT, SSUBDIV_DLVR, ', '); + SRESULT := STRCOMBINE(SRESULT, TO_CHAR(NMAIN_QUANT), ', '); + /* Возвращаем результат */ + return SRESULT; + end MAKE_INFO; + + /* Инициализация динамических атрибутов */ + procedure TASK_ATTRS_INIT + ( + RG in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта + ) + is + begin + /* Добавим динамические атрибуты к спецификациям */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_PROD_ORDER, SCAPTION => 'Заказ'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_SUBDIV_DLVR, + SCAPTION => 'Сдающее подразделение'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_MAIN_QUANT, + SCAPTION => 'Выпуск'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_DEFRESLIZ, + SCAPTION => 'Дефицит запуска'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_REL_FACT, + SCAPTION => 'Выпуск факт'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, + SNAME => STASK_ATTR_DEFSTART, + SCAPTION => 'Дефицит выпуска'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_LEVEL, SCAPTION => 'Уровень'); + end TASK_ATTRS_INIT; + + /* Инициализация цветов */ + procedure TASK_COLORS_INIT + ( + RG in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта + ) + is + begin + /* Добавим описание цветов */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_RED, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0.'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_YELLOW, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_GREEN, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.'); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_GREEN, + SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW, + SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. '); + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, + SBG_COLOR => SBG_COLOR_BLACK, + STEXT_COLOR => STEXT_COLOR_ORANGE, + SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».'); + end TASK_COLORS_INIT; + + /* Заполнение значений динамических атрибутов */ + procedure FILL_TASK_ATTRS + ( + RG in PKG_P8PANELS_VISUAL.TGANTT, -- Описание диаграммы Ганта + RGT in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы + SPROD_ORDER in varchar2, -- Заказ + SSUBDIV_DLVR in varchar2, -- Сдающее подразделение + NMAIN_QUANT in number, -- Выпуск + NDEFRESLIZ in number, -- Дефицит запуска + NREL_FACT in number, -- Выпуск факт + NDEFSTART in number, -- Дефицит выпуска + NLEVEL in number -- Уровень + ) + is + begin + /* Добавим доп. атрибуты */ + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_PROD_ORDER, + SVALUE => SPROD_ORDER, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_SUBDIV_DLVR, + SVALUE => SSUBDIV_DLVR); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_MAIN_QUANT, + SVALUE => TO_CHAR(NMAIN_QUANT)); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_DEFRESLIZ, + SVALUE => TO_CHAR(NDEFRESLIZ)); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_REL_FACT, + SVALUE => TO_CHAR(NREL_FACT)); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_DEFSTART, + SVALUE => TO_CHAR(NDEFSTART)); + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, + RTASK => RGT, + SNAME => STASK_ATTR_LEVEL, + SVALUE => TO_CHAR(NLEVEL)); + end FILL_TASK_ATTRS; begin /* Инициализируем диаграмму Ганта */ - RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => TITLE_GET(NRN => NFCPRODPLAN), + RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => 'Производственная программа', NZOOM => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_DAY, BREAD_ONLY_DATES => BREAD_ONLY_DATES, BREAD_ONLY_PROGRESS => true); - /* Добавим динамические атрибуты к спецификациям */ - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, - SNAME => STASK_ATTR_DEFRESLIZ, - SCAPTION => 'Дефицит запуска'); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, - SNAME => STASK_ATTR_REL_FACT, - SCAPTION => 'Выпуск факт'); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, - SNAME => STASK_ATTR_DEFSTART, - SCAPTION => 'Дефицит выпуска'); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_LEVEL, SCAPTION => 'Уровень'); - /* Добавим описание цветов */ - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, - SBG_COLOR => SBG_COLOR_RED, - SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0.'); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, - SBG_COLOR => SBG_COLOR_YELLOW, - SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.'); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, - SBG_COLOR => SBG_COLOR_GREEN, - SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.'); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, - SBG_COLOR => SBG_COLOR_GREEN, - SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW, - SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. '); - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG, - SBG_COLOR => SBG_COLOR_BLACK, - STEXT_COLOR => STEXT_COLOR_ORANGE, - SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».'); + /* Инициализируем динамические атрибуты к спецификациям */ + TASK_ATTRS_INIT(RG => RG); + /* Инициализируем описания цветов */ + TASK_COLORS_INIT(RG => RG); /* Определяем максимальный уровень иерархии */ - NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NPRODPLAN => NFCPRODPLAN); - /* Цикл по спецификации плана с учетом иерархии */ - for REC in (select TMP.*, - level - from (select T.RN, - T.REP_DATE, - T.REP_DATE_TO, - T.INCL_DATE, - T.ROUTE, - D.NOMEN_NAME, - (T.QUANT_REST - T.START_FACT) DEFRESLIZ, - T.REL_FACT, - (T.MAIN_QUANT - T.REL_FACT) DEFSTART, + NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN); + /* Обходим данные */ + begin + CSQL := 'select TMP.*, + level NTASK_LEVEL + from (select T.RN NRN, + T.PRN NPRN, + (select PORD.NUMB from FACEACC PORD where PORD.RN = T.PROD_ORDER) SPROD_ORDER, + T.REP_DATE DREP_DATE, + T.REP_DATE_TO DREP_DATE_TO, + T.INCL_DATE DINCL_DATE, + T.ROUTE SROUTE, + D.NOMEN_NAME SNOMEN_NAME, + (T.QUANT_REST - T.START_FACT) NDEFRESLIZ, + T.REL_FACT NREL_FACT, + (T.MAIN_QUANT - T.REL_FACT) NDEFSTART, + T.MAIN_QUANT NMAIN_QUANT, + (select IDD.CODE from INS_DEPARTMENT IDD where IDD.RN = T.SUBDIV_DLVR) SSUBDIV_DLVR, (select 1 from DUAL where exists (select null from DOCLINKS L where L.IN_DOCUMENT = T.RN - and L.IN_UNITCODE = 'CostProductPlansSpecs' - and (L.OUT_UNITCODE = 'CostRouteLists' or L.OUT_UNITCODE = 'IncomFromDeps') - and ROWNUM = 1)) HAVE_LINK, - T.UP_LEVEL - from FCPRODPLANSP T, + and L.IN_UNITCODE = ''CostProductPlansSpecs'' + and (L.OUT_UNITCODE = ''CostRouteLists'' or L.OUT_UNITCODE = ''IncomFromDeps'') + and ROWNUM = 1)) NHAVE_LINK, + T.UP_LEVEL NUP_LEVEL + from FCPRODPLAN P, + FINSTATE FS, + FCPRODPLANSP T, FCMATRESOURCE FM, DICNOMNS D - where T.PRN = NFCPRODPLAN + where P.CRN = :NCRN + and P.CATEGORY = :NFCPRODPLAN_CATEGORY + and P.STATUS = :NFCPRODPLAN_STATUS + and FS.RN = P.TYPE + and FS.CODE = :SFCPRODPLAN_TYPE + and exists + (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = ''CostProductPlans'' + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = ''CostProductPlans'' + and UP.AUTHID = UTILIZER) + and T.PRN = P.RN and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null)) and FM.RN = T.MATRES and D.RN = FM.NOMENCLATURE) TMP - where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL))) - connect by prior TMP.RN = TMP.UP_LEVEL - start with TMP.UP_LEVEL is null) - loop - /* Инициализируем даты и цвет (если необходимо) */ - FCPRODPLANSP_DATES_GET(DREP_DATE => REC.REP_DATE, - DREP_DATE_TO => REC.REP_DATE_TO, - DINCL_DATE => REC.INCL_DATE, - NHAVE_LINK => COALESCE(REC.HAVE_LINK, 0), - DDATE_FROM => DDATE_FROM, - DDATE_TO => DDATE_TO, - STASK_BG_COLOR => STASK_BG_COLOR, - STASK_TEXT_COLOR => STASK_TEXT_COLOR, - NTASK_PROGRESS => NTASK_PROGRESS); - /* Если цвет изначально не указан и требуется анализирование */ - if (STASK_BG_COLOR is null) then - /* Формирование характеристик элемента ганта */ - MAKE_GANT_ITEM(NDEFRESLIZ => REC.DEFRESLIZ, - NREL_FACT => REC.REL_FACT, - NDEFSTART => REC.DEFSTART, - STASK_BG_COLOR => STASK_BG_COLOR, - STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, - NTASK_PROGRESS => NTASK_PROGRESS); + where ((:NLEVEL is null) or ((:NLEVEL is not null) and (level <= :NLEVEL))) + connect by prior TMP.NRN = TMP.NUP_LEVEL + start with TMP.NUP_LEVEL is null + order siblings by TMP.%SORT_FIELD% asc'; + /* Подставляем поле сортировки */ + CSQL := replace(CSQL, '%SORT_FIELD%', SSORT_FIELD); + /* Разбираем его */ + ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); + PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); + /* Делаем подстановку параметров */ + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCRN', NVALUE => NCRN); + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, + SNAME => 'NFCPRODPLAN_CATEGORY', + NVALUE => NFCPRODPLAN_CATEGORY); + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLAN_STATUS', NVALUE => NFCPRODPLAN_STATUS); + PKG_SQL_DML.BIND_VARIABLE_STR(ICURSOR => ICURSOR, SNAME => 'SFCPRODPLAN_TYPE', SVALUE => SFCPRODPLAN_TYPE); + PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NLEVEL', NVALUE => NLEVEL); + /* Описываем структуру записи курсора */ + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 2); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); + PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4); + PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5); + PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 8); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 13); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 14); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 15); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 16); + /* Делаем выборку */ + if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then + null; end if; - /* Сформируем основную спецификацию */ - RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => REC.RN, - SNUMB => COALESCE(REC.ROUTE, 'Отсутствует'), - SCAPTION => REC.NOMEN_NAME, - SNAME => REC.NOMEN_NAME, - DSTART => DDATE_FROM, - DEND => DDATE_TO, - NPROGRESS => NTASK_PROGRESS, - SBG_COLOR => STASK_BG_COLOR, - STEXT_COLOR => STASK_TEXT_COLOR, - SBG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, - BREAD_ONLY => true, - BREAD_ONLY_DATES => true, - BREAD_ONLY_PROGRESS => true); - /* Добавим доп. атрибуты */ - PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, - RTASK => RGT, - SNAME => STASK_ATTR_DEFRESLIZ, - SVALUE => TO_CHAR(REC.DEFRESLIZ), - BCLEAR => true); - PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, - RTASK => RGT, - SNAME => STASK_ATTR_REL_FACT, - SVALUE => TO_CHAR(REC.REL_FACT)); - PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, - RTASK => RGT, - SNAME => STASK_ATTR_DEFSTART, - SVALUE => TO_CHAR(REC.DEFSTART)); - PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, - RTASK => RGT, - SNAME => STASK_ATTR_LEVEL, - SVALUE => REC.LEVEL); - /* Собираем зависимости */ - for LINK in (select T.RN - from FCPRODPLANSP T - where T.PRN = NFCPRODPLAN - and T.UP_LEVEL = REC.RN - and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= REC.LEVEL + 1)))) + /* Обходим выбранные записи */ + while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop - /* Добавляем зависимости */ - PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN); + /* Читаем данные из курсора */ + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NTASK_RN); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NTASK_PRN); + PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 3, SVALUE => STASK_PROD_ORDER); + PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 4, DVALUE => DTASK_REP_DATE); + PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 5, DVALUE => DTASK_REP_DATE_TO); + PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 6, DVALUE => DTASK_INCL_DATE); + PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 7, SVALUE => STASK_ROUTE); + PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 8, SVALUE => STASK_NOMEN_NAME); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 9, NVALUE => NTASK_DEFRESLIZ); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NTASK_REL_FACT); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NTASK_DEFSTART); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 12, NVALUE => NTASK_MAIN_QUANT); + PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 13, SVALUE => STASK_SUBDIV_DLVR); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 14, NVALUE => NTASK_HAVE_LINK); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 15, NVALUE => NTASK_UP_LEVEL); + PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 16, NVALUE => NTASK_LEVEL); + /* Формируем описание задачи в Ганте */ + STASK_CAPTION := MAKE_INFO(SPROD_ORDER => STASK_PROD_ORDER, + SNOMEN_NAME => STASK_NOMEN_NAME, + SSUBDIV_DLVR => STASK_SUBDIV_DLVR, + NMAIN_QUANT => NTASK_MAIN_QUANT); + /* Инициализируем даты и цвет (если необходимо) */ + FCPRODPLANSP_DATES_GET(DREP_DATE => DTASK_REP_DATE, + DREP_DATE_TO => DTASK_REP_DATE_TO, + DINCL_DATE => DTASK_INCL_DATE, + NHAVE_LINK => COALESCE(NTASK_HAVE_LINK, 0), + DDATE_FROM => DDATE_FROM, + DDATE_TO => DDATE_TO, + STASK_BG_COLOR => STASK_BG_COLOR, + STASK_TEXT_COLOR => STASK_TEXT_COLOR, + NTASK_PROGRESS => NTASK_PROGRESS); + /* Если цвет изначально не указан и требуется анализирование */ + if (STASK_BG_COLOR is null) then + /* Формирование характеристик элемента ганта */ + MAKE_GANT_ITEM(NDEFRESLIZ => NTASK_DEFRESLIZ, + NREL_FACT => NTASK_REL_FACT, + NDEFSTART => NTASK_DEFSTART, + STASK_BG_COLOR => STASK_BG_COLOR, + STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, + NTASK_PROGRESS => NTASK_PROGRESS); + end if; + /* Сформируем основную спецификацию */ + RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => NTASK_RN, + SNUMB => COALESCE(STASK_ROUTE, 'Отсутствует'), + SCAPTION => STASK_CAPTION, + SNAME => STASK_NOMEN_NAME, + DSTART => DDATE_FROM, + DEND => DDATE_TO, + NPROGRESS => NTASK_PROGRESS, + SBG_COLOR => STASK_BG_COLOR, + STEXT_COLOR => STASK_TEXT_COLOR, + SBG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, + BREAD_ONLY => true, + BREAD_ONLY_DATES => true, + BREAD_ONLY_PROGRESS => true); + /* Заполним значение динамических атрибутов */ + FILL_TASK_ATTRS(RG => RG, + RGT => RGT, + SPROD_ORDER => STASK_PROD_ORDER, + SSUBDIV_DLVR => STASK_SUBDIV_DLVR, + NMAIN_QUANT => NTASK_MAIN_QUANT, + NDEFRESLIZ => NTASK_DEFRESLIZ, + NREL_FACT => NTASK_REL_FACT, + NDEFSTART => NTASK_DEFSTART, + NLEVEL => NTASK_LEVEL); + /* Собираем зависимости */ + for LINK in (select T.RN + from FCPRODPLANSP T + where T.PRN = NTASK_PRN + and T.UP_LEVEL = NTASK_RN + and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= NTASK_LEVEL + 1)))) + loop + /* Добавляем зависимости */ + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN); + end loop; + /* Добавляем основную спецификацию в диаграмму */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT); end loop; - /* Добавляем основную спецификацию в диаграмму */ - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT); - end loop; + /* Освобождаем курсор */ + PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); + exception + when others then + PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); + raise; + end; /* Формируем список */ COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG); end FCPRODPLANSP_GET; - - /* Инициализация планов и отчетов производства изделий */ - procedure PRODPLAN_INIT + + /* Инициализация каталогов раздела "Планы и отчеты производства изделий" */ + procedure ACATALOG_INIT ( - COUT out clob -- Список планов и отчетов производства изделий + COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий" ) is begin @@ -356,54 +556,27 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Открываем корень */ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA'); /* Цикл по планам и отчетам производства изделий */ - for REC in (select T.RN NRN, - D.DOCCODE || ', ' || trim(T.PREFIX) || '/' || trim(T.NUMB) || ', ' || - TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO - from FCPRODPLAN T, - DOCTYPES D, - FINSTATE FS - where T.CATEGORY = NFCPRODPLAN_CATEGORY - and T.STATUS = NFCPRODPLAN_STATUS - and D.RN = T.DOCTYPE - and FS.RN = T.TYPE - and FS.CODE = SFCPRODPLAN_TYPE - and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ - null - from USERPRIV UP - where UP.CATALOG = T.CRN - and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ - UR.ROLEID - from USERROLES UR - where UR.AUTHID = UTILIZER) - union all - select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ - null - from USERPRIV UP - where UP.CATALOG = T.CRN - and UP.AUTHID = UTILIZER) - and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ - null - from USERPRIV UP - where UP.JUR_PERS = T.JUR_PERS - and UP.UNITCODE = 'CostProductPlans' - and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ - UR.ROLEID - from USERROLES UR - where UR.AUTHID = UTILIZER) - union all - select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ - null - from USERPRIV UP - where UP.JUR_PERS = T.JUR_PERS - and UP.UNITCODE = 'CostProductPlans' - and UP.AUTHID = UTILIZER) - order by T.DOCDATE desc) + for REC in (select T.RN as NRN, + T.NAME as SNAME + from ACATALOG T, + UNITLIST UL + where T.DOCNAME = 'CostProductPlans' + and T.SIGNS = 1 + and T.DOCNAME = UL.UNITCODE + and (UL.SHOW_INACCESS_CTLG = 1 or exists + (select null from V_USERPRIV UP where UP.CATALOG = T.RN) or exists + (select null + from ACATALOG T1 + where exists (select null from V_USERPRIV UP where UP.CATALOG = T1.RN) + connect by prior T1.RN = T1.CRN + start with T1.CRN = T.RN)) + order by T.NAME asc) loop /* Открываем план */ - PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLANS'); + PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_CRNS'); /* Описываем план */ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN); - PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => REC.SDOC_INFO); + PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME); /* Закрываем план */ PKG_XFAST.UP(); end loop; @@ -420,7 +593,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); - end PRODPLAN_INIT; - + end ACATALOG_INIT; + end PKG_P8PANELS_MECHREC; / -- 2.34.1 From 6e29a03325d7caf08707ee8f739b93bac2be2371 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 15 Feb 2024 14:55:30 +0300 Subject: [PATCH 13/27] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index e6f2245..f84f00a 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3326,7 +3326,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlans: () => (/* binding */ useFilteredPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор загруженных планов по поисковой фразе\nconst useFilteredPlans = (plans, filter) => {\n const filteredPlans = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlanCtlgs: () => (/* binding */ useFilteredPlanCtlgs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор загруженных планов по поисковой фразе\nconst useFilteredPlanCtlgs = (planCtlgs, filter) => {\n const filteredPlanCtlgs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter));\n }, [planCtlgs, filter]);\n return filteredPlanCtlgs;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); /***/ }), @@ -3348,7 +3348,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Список планов\nconst PlansList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgGanttDef: {},\n selectedPlanCtlgSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ACATALOG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.selectedPlanCtlgSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В каталоге планов отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n value: el,\n key: el\n }, el))))) :\n // \n null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanCtlgGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanCtlgSpecs\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), -- 2.34.1 From 609298d01e32a2b860190cd6b84b1d6ee5ebc425 Mon Sep 17 00:00:00 2001 From: Dollerino Date: Thu, 15 Feb 2024 15:19:31 +0300 Subject: [PATCH 14/27] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-798=20-=20=D0=A4?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D1=8B=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/frappe-gantt/frappe-gantt.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libs/frappe-gantt/frappe-gantt.js b/libs/frappe-gantt/frappe-gantt.js index 68f7968..6d14acd 100644 --- a/libs/frappe-gantt/frappe-gantt.js +++ b/libs/frappe-gantt/frappe-gantt.js @@ -1261,7 +1261,9 @@ var Gantt = (function () { setup_layers() { this.layers = {}; - const layers = ['grid', 'date', 'arrow', 'progress', 'bar', 'details']; + //ЦИТК + const layers = ['grid', 'arrow', 'progress', 'bar', 'details', 'date']; + //ЦИТК // make group layers for (let layer of layers) { this.layers[layer] = createSVG('g', { @@ -1343,7 +1345,9 @@ var Gantt = (function () { width: header_width, height: header_height, class: 'grid-header', - append_to: this.layers.grid, + //ЦИТК + append_to: this.layers.date + //ЦИТК }); } @@ -1716,7 +1720,11 @@ var Gantt = (function () { is_resizing_left = false; is_resizing_right = false; }); - + + //ЦИТК + $.on(this.$container, 'scroll', e => { this.layers.date.setAttribute('transform', 'translate(0,'+ e.currentTarget.scrollTop +')'); }); + //ЦИТК + $.on(this.$svg, 'mouseup', (e) => { //ЦИТК const fireId = this.bar_being_dragged; -- 2.34.1 From a0e9be4c4ba5a515d911131f2d9bed516ae59d13 Mon Sep 17 00:00:00 2001 From: Dollerino Date: Fri, 16 Feb 2024 17:24:08 +0300 Subject: [PATCH 15/27] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-802=20-=20=D0=98?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=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 | 8 +- .../mech_rec_cost_prod_plans.js | 93 +++++++++++++++++-- db/PKG_P8PANELS_MECHREC.pck | 32 ++++++- 3 files changed, 118 insertions(+), 15 deletions(-) diff --git a/app/panels/mech_rec_cost_prod_plans/hooks.js b/app/panels/mech_rec_cost_prod_plans/hooks.js index 926fc8a..dd285c4 100644 --- a/app/panels/mech_rec_cost_prod_plans/hooks.js +++ b/app/panels/mech_rec_cost_prod_plans/hooks.js @@ -13,10 +13,14 @@ import React from "react"; //Классы React //Тело модуля //----------- -//Клиентский отбор загруженных планов по поисковой фразе +//Клиентский отбор каталогов по поисковой фразе и наличию планов export const useFilteredPlanCtlgs = (planCtlgs, filter) => { const filteredPlanCtlgs = React.useMemo(() => { - return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter)); + return planCtlgs.filter( + catalog => + catalog.SNAME.toString().toLowerCase().includes(filter.ctlgName) && + (filter.haveDocs ? catalog.NCOUNT_DOCS > 0 : catalog.NCOUNT_DOCS >= 0) + ); }, [planCtlgs, filter]); return filteredPlanCtlgs; 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 bb2a489..b4e2b01 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 @@ -9,7 +9,23 @@ 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 { + Drawer, + Fab, + Box, + List, + ListItemButton, + ListItemText, + Typography, + Grid, + TextField, + Select, + MenuItem, + InputLabel, + FormGroup, + FormControlLabel, + Checkbox +} from "@mui/material"; //Интерфейсные элементы import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения @@ -21,6 +37,9 @@ import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные //Константы //--------- +//Склонения для документов +const DECLINATIONS = ["план", "плана", "планов"]; + //Поля сортировки const SORT_REP_DATE = "DREP_DATE"; const SORT_REP_DATE_TO = "DREP_DATE_TO"; @@ -34,13 +53,16 @@ const GANTT_WIDTH = "98vw"; //Стили const STYLES = { PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" }, + PLANS_CHECKBOX_HAVEDOCS: { alignContent: "space-around" }, + 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_DRAWER: { - minWidth: "250px", + width: "350px", display: "inline-block", flexShrink: 0, - [`& .MuiDrawer-paper`]: { minWidth: "250px", display: "inline-block", boxSizing: "border-box" } + [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" } }, GANTT_CONTAINER: { height: GANTT_HEIGHT, width: GANTT_WIDTH }, GANTT_TITLE: { paddingLeft: "100px", paddingRight: "120px" } @@ -59,6 +81,26 @@ const parseProdPlanSpXML = async xmlDoc => { return data.XDATA; }; +//Форматирование для отображения количества документов +const formatCountDocs = nCountDocs => { + //Получаем последнюю цифру в значении + let num = (nCountDocs % 100) % 10; + //Документов + if (nCountDocs > 10 && nCountDocs < 20) { + return `${nCountDocs} ${DECLINATIONS[2]}`; + } + //Документа + if (num > 1 && num < 5) { + return `${nCountDocs} ${DECLINATIONS[1]}`; + } + //Документ + if (num == 1) { + return `${nCountDocs} ${DECLINATIONS[0]}`; + } + //Документов + return `${nCountDocs} ${DECLINATIONS[2]}`; +}; + //Список каталогов планов const PlanCtlgsList = ({ planCtlgs = [], selectedPlanCtlg, filter, setFilter, onClick } = {}) => { //Генерация содержимого @@ -67,18 +109,48 @@ const PlanCtlgsList = ({ planCtlgs = [], selectedPlanCtlg, filter, setFilter, on { - setFilter(event.target.value); + setFilter(pv => ({ ...pv, ctlgName: event.target.value })); }} > + + { + setFilter(pv => ({ ...pv, haveDocs: event.target.checked })); + }} + /> + } + label="Только с планами" + labelPlacement="end" + /> + {planCtlgs.map(p => ( - (onClick ? onClick(p) : null)}> - {p.SNAME}} /> + (onClick ? onClick(p) : null)} + > + {p.SNAME}} + secondary={ + + {formatCountDocs(p.NCOUNT_DOCS)} + + } + /> ))} @@ -116,9 +188,10 @@ const MechRecCostProdPlans = () => { selectedPlanCtlgGanttDef: {}, selectedPlanCtlgSpecs: [] }); + //Состояние для фильтра каталогов + const [filter, setFilter] = useState({ ctlgName: "", haveLinks: false }); - const [filter, setFilter] = useState(""); - + //Массив отфильтрованных каталогов const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter); //Подключение к контексту сообщений diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 5ce95c9..4f733a8 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -207,8 +207,8 @@ create or replace package body PKG_P8PANELS_MECHREC as CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса /* Значения спецификации */ - NTASK_RN PKG_STD.TREF; -- Рег. номер спецификации - NTASK_PRN PKG_STD.TREF; -- Рег. номер родителя спецификации + NTASK_RN PKG_STD.TREF; -- Рег. номер спецификации + NTASK_PRN PKG_STD.TREF; -- Рег. номер родителя спецификации STASK_PROD_ORDER PKG_STD.TSTRING; -- Заказ DTASK_REP_DATE PKG_STD.TLDATE; -- Дата запуска DTASK_REP_DATE_TO PKG_STD.TLDATE; -- Дата выпуска @@ -557,7 +557,32 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_XFAST.DOWN_NODE(SNAME => 'XDATA'); /* Цикл по планам и отчетам производства изделий */ for REC in (select T.RN as NRN, - T.NAME as SNAME + T.NAME as SNAME, + (select count(P.RN) + from FCPRODPLAN P, + FINSTATE FS + where P.CRN = T.RN + and P.CATEGORY = NFCPRODPLAN_CATEGORY + and P.STATUS = NFCPRODPLAN_STATUS + and FS.RN = P.TYPE + and FS.CODE = SFCPRODPLAN_TYPE + and exists + (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.AUTHID = UTILIZER)) as NCOUNT_DOCS from ACATALOG T, UNITLIST UL where T.DOCNAME = 'CostProductPlans' @@ -577,6 +602,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Описываем план */ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN); PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME); + PKG_XFAST.ATTR(SNAME => 'NCOUNT_DOCS', NVALUE => REC.NCOUNT_DOCS); /* Закрываем план */ PKG_XFAST.UP(); end loop; -- 2.34.1 From 7ef89565dec13efedb99926681433ed61ce3e24d Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 16 Feb 2024 17:34:15 +0300 Subject: [PATCH 16/27] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 125 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 2 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index f84f00a..66a870e 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -591,6 +591,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/Checkbox/Checkbox.js": +/*!*********************************************************!*\ + !*** ./node_modules/@mui/material/Checkbox/Checkbox.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/refType.js\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_system__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/system */ \"./node_modules/@mui/system/esm/colorManipulator.js\");\n/* harmony import */ var _internal_SwitchBase__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../internal/SwitchBase */ \"./node_modules/@mui/material/internal/SwitchBase.js\");\n/* harmony import */ var _internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../internal/svg-icons/CheckBoxOutlineBlank */ \"./node_modules/@mui/material/internal/svg-icons/CheckBoxOutlineBlank.js\");\n/* harmony import */ var _internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../internal/svg-icons/CheckBox */ \"./node_modules/@mui/material/internal/svg-icons/CheckBox.js\");\n/* harmony import */ var _internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../internal/svg-icons/IndeterminateCheckBox */ \"./node_modules/@mui/material/internal/svg-icons/IndeterminateCheckBox.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./node_modules/@mui/material/utils/capitalize.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _checkboxClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./checkboxClasses */ \"./node_modules/@mui/material/Checkbox/checkboxClasses.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"checkedIcon\", \"color\", \"icon\", \"indeterminate\", \"indeterminateIcon\", \"inputProps\", \"size\", \"className\"];\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n indeterminate,\n color,\n size\n } = ownerState;\n const slots = {\n root: ['root', indeterminate && 'indeterminate', `color${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(color)}`, `size${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(size)}`]\n };\n const composedClasses = (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _checkboxClasses__WEBPACK_IMPORTED_MODULE_7__.getCheckboxUtilityClass, classes);\n return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, classes, composedClasses);\n};\nconst CheckboxRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(_internal_SwitchBase__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n shouldForwardProp: prop => (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__.rootShouldForwardProp)(prop) || prop === 'classes',\n name: 'MuiCheckbox',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.indeterminate && styles.indeterminate, ownerState.color !== 'default' && styles[`color${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ownerState.color)}`]];\n }\n})(({\n theme,\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n color: (theme.vars || theme).palette.text.secondary\n}, !ownerState.disableRipple && {\n '&:hover': {\n backgroundColor: theme.vars ? `rgba(${ownerState.color === 'default' ? theme.vars.palette.action.activeChannel : theme.vars.palette.primary.mainChannel} / ${theme.vars.palette.action.hoverOpacity})` : (0,_mui_system__WEBPACK_IMPORTED_MODULE_10__.alpha)(ownerState.color === 'default' ? theme.palette.action.active : theme.palette[ownerState.color].main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n}, ownerState.color !== 'default' && {\n [`&.${_checkboxClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].checked}, &.${_checkboxClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].indeterminate}`]: {\n color: (theme.vars || theme).palette[ownerState.color].main\n },\n [`&.${_checkboxClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.action.disabled\n }\n}));\nconst defaultCheckedIcon = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {});\nconst defaultIcon = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {});\nconst defaultIndeterminateIcon = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {});\nconst Checkbox = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function Checkbox(inProps, ref) {\n var _icon$props$fontSize, _indeterminateIcon$pr;\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_14__[\"default\"])({\n props: inProps,\n name: 'MuiCheckbox'\n });\n const {\n checkedIcon = defaultCheckedIcon,\n color = 'primary',\n icon: iconProp = defaultIcon,\n indeterminate = false,\n indeterminateIcon: indeterminateIconProp = defaultIndeterminateIcon,\n inputProps,\n size = 'medium',\n className\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const icon = indeterminate ? indeterminateIconProp : iconProp;\n const indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon;\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n color,\n indeterminate,\n size\n });\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(CheckboxRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n type: \"checkbox\",\n inputProps: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n 'data-indeterminate': indeterminate\n }, inputProps),\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(icon, {\n fontSize: (_icon$props$fontSize = icon.props.fontSize) != null ? _icon$props$fontSize : size\n }),\n checkedIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(indeterminateIcon, {\n fontSize: (_indeterminateIcon$pr = indeterminateIcon.props.fontSize) != null ? _indeterminateIcon$pr : size\n }),\n ownerState: ownerState,\n ref: ref,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className)\n }, other, {\n classes: classes\n }));\n});\n true ? Checkbox.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * If `true`, the component is checked.\n */\n checked: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool),\n /**\n * The icon to display when the component is checked.\n * @default \n */\n checkedIcon: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().node),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string),\n /**\n * The color of the component.\n * It supports both default and custom theme colors, which can be added as shown in the\n * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).\n * @default 'primary'\n */\n color: prop_types__WEBPACK_IMPORTED_MODULE_15___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_15___default().oneOf(['default', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string)]),\n /**\n * The default checked state. Use when the component is not controlled.\n */\n defaultChecked: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool),\n /**\n * If `true`, the component is disabled.\n * @default false\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool),\n /**\n * If `true`, the ripple effect is disabled.\n * @default false\n */\n disableRipple: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool),\n /**\n * The icon to display when the component is unchecked.\n * @default \n */\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().node),\n /**\n * The id of the `input` element.\n */\n id: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string),\n /**\n * If `true`, the component appears indeterminate.\n * This does not set the native input element to indeterminate due\n * to inconsistent behavior across browsers.\n * However, we set a `data-indeterminate` attribute on the `input`.\n * @default false\n */\n indeterminate: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool),\n /**\n * The icon to display when the component is indeterminate.\n * @default \n */\n indeterminateIcon: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().node),\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().object),\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: _mui_utils__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n /**\n * Callback fired when the state is changed.\n *\n * @param {React.ChangeEvent} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func),\n /**\n * If `true`, the `input` element is required.\n * @default false\n */\n required: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool),\n /**\n * The size of the component.\n * `small` is equivalent to the dense checkbox styling.\n * @default 'medium'\n */\n size: prop_types__WEBPACK_IMPORTED_MODULE_15___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_15___default().oneOf(['medium', 'small']), (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string)]),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_15___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_15___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_15___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_15___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_15___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_15___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_15___default().object)]),\n /**\n * The value of the component. The DOM API casts this to a string.\n * The browser uses \"on\" as the default value.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().any)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Checkbox);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Checkbox/Checkbox.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/Checkbox/checkboxClasses.js": +/*!****************************************************************!*\ + !*** ./node_modules/@mui/material/Checkbox/checkboxClasses.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getCheckboxUtilityClass: () => (/* binding */ getCheckboxUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getCheckboxUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiCheckbox', slot);\n}\nconst checkboxClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiCheckbox', ['root', 'checked', 'disabled', 'indeterminate', 'colorPrimary', 'colorSecondary', 'sizeSmall', 'sizeMedium']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (checkboxClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Checkbox/checkboxClasses.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/Chip/Chip.js": /*!*************************************************!*\ !*** ./node_modules/@mui/material/Chip/Chip.js ***! @@ -855,6 +877,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/FormControlLabel/FormControlLabel.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@mui/material/FormControlLabel/FormControlLabel.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FormControlLabelRoot: () => (/* binding */ FormControlLabelRoot),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/refType.js\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../FormControl */ \"./node_modules/@mui/material/FormControl/useFormControl.js\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Stack */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Typography */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./node_modules/@mui/material/utils/capitalize.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./formControlLabelClasses */ \"./node_modules/@mui/material/FormControlLabel/formControlLabelClasses.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./node_modules/@mui/material/FormControl/formControlState.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"checked\", \"className\", \"componentsProps\", \"control\", \"disabled\", \"disableTypography\", \"inputRef\", \"label\", \"labelPlacement\", \"name\", \"onChange\", \"required\", \"slotProps\", \"value\"];\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n disabled,\n labelPlacement,\n error,\n required\n } = ownerState;\n const slots = {\n root: ['root', disabled && 'disabled', `labelPlacement${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(labelPlacement)}`, error && 'error', required && 'required'],\n label: ['label', disabled && 'disabled'],\n asterisk: ['asterisk', error && 'error']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__.getFormControlLabelUtilityClasses, classes);\n};\nconst FormControlLabelRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('label', {\n name: 'MuiFormControlLabel',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [{\n [`& .${_formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].label}`]: styles.label\n }, styles.root, styles[`labelPlacement${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ownerState.labelPlacement)}`]];\n }\n})(({\n theme,\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n // For correct alignment with the text.\n verticalAlign: 'middle',\n WebkitTapHighlightColor: 'transparent',\n marginLeft: -11,\n marginRight: 16,\n // used for row presentation of radio/checkbox\n [`&.${_formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n cursor: 'default'\n }\n}, ownerState.labelPlacement === 'start' && {\n flexDirection: 'row-reverse',\n marginLeft: 16,\n // used for row presentation of radio/checkbox\n marginRight: -11\n}, ownerState.labelPlacement === 'top' && {\n flexDirection: 'column-reverse',\n marginLeft: 16\n}, ownerState.labelPlacement === 'bottom' && {\n flexDirection: 'column',\n marginLeft: 16\n}, {\n [`& .${_formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].label}`]: {\n [`&.${_formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.text.disabled\n }\n }\n}));\nconst AsteriskComponent = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('span', {\n name: 'MuiFormControlLabel',\n slot: 'Asterisk',\n overridesResolver: (props, styles) => styles.asterisk\n})(({\n theme\n}) => ({\n [`&.${_formControlLabelClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].error}`]: {\n color: (theme.vars || theme).palette.error.main\n }\n}));\n\n/**\n * Drop-in replacement of the `Radio`, `Switch` and `Checkbox` component.\n * Use this component if you want to display an extra label.\n */\nconst FormControlLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function FormControlLabel(inProps, ref) {\n var _ref, _slotProps$typography;\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__[\"default\"])({\n props: inProps,\n name: 'MuiFormControlLabel'\n });\n const {\n className,\n componentsProps = {},\n control,\n disabled: disabledProp,\n disableTypography,\n label: labelProp,\n labelPlacement = 'end',\n required: requiredProp,\n slotProps = {}\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const muiFormControl = (0,_FormControl__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const disabled = (_ref = disabledProp != null ? disabledProp : control.props.disabled) != null ? _ref : muiFormControl == null ? void 0 : muiFormControl.disabled;\n const required = requiredProp != null ? requiredProp : control.props.required;\n const controlProps = {\n disabled,\n required\n };\n ['checked', 'name', 'onChange', 'value', 'inputRef'].forEach(key => {\n if (typeof control.props[key] === 'undefined' && typeof props[key] !== 'undefined') {\n controlProps[key] = props[key];\n }\n });\n const fcs = (0,_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_11__[\"default\"])({\n props,\n muiFormControl,\n states: ['error']\n });\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n disabled,\n labelPlacement,\n required,\n error: fcs.error\n });\n const classes = useUtilityClasses(ownerState);\n const typographySlotProps = (_slotProps$typography = slotProps.typography) != null ? _slotProps$typography : componentsProps.typography;\n let label = labelProp;\n if (label != null && label.type !== _Typography__WEBPACK_IMPORTED_MODULE_12__[\"default\"] && !disableTypography) {\n label = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_Typography__WEBPACK_IMPORTED_MODULE_12__[\"default\"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n component: \"span\"\n }, typographySlotProps, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.label, typographySlotProps == null ? void 0 : typographySlotProps.className),\n children: label\n }));\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(FormControlLabelRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n ownerState: ownerState,\n ref: ref\n }, other, {\n children: [/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(control, controlProps), required ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_Stack__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n direction: \"row\",\n alignItems: \"center\",\n children: [label, /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(AsteriskComponent, {\n ownerState: ownerState,\n \"aria-hidden\": true,\n className: classes.asterisk,\n children: [\"\\u2009\", '*']\n })]\n }) : label]\n }));\n});\n true ? FormControlLabel.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * If `true`, the component appears selected.\n */\n checked: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n /**\n * The props used for each slot inside.\n * @default {}\n */\n componentsProps: prop_types__WEBPACK_IMPORTED_MODULE_14___default().shape({\n typography: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)\n }),\n /**\n * A control element. For instance, it can be a `Radio`, a `Switch` or a `Checkbox`.\n */\n control: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().element).isRequired,\n /**\n * If `true`, the control is disabled.\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool),\n /**\n * If `true`, the label is rendered as it is passed without an additional typography node.\n */\n disableTypography: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool),\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: _mui_utils__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n /**\n * A text or an element to be used in an enclosing label element.\n */\n label: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().node),\n /**\n * The position of the label.\n * @default 'end'\n */\n labelPlacement: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOf(['bottom', 'end', 'start', 'top']),\n /**\n * @ignore\n */\n name: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n /**\n * Callback fired when the state is changed.\n *\n * @param {React.SyntheticEvent} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n /**\n * If `true`, the label will indicate that the `input` is required.\n */\n required: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool),\n /**\n * The props used for each slot inside.\n * @default {}\n */\n slotProps: prop_types__WEBPACK_IMPORTED_MODULE_14___default().shape({\n typography: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)\n }),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_14___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object)]),\n /**\n * The value of the component.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().any)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormControlLabel);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/FormControlLabel/FormControlLabel.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/FormControlLabel/formControlLabelClasses.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@mui/material/FormControlLabel/formControlLabelClasses.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getFormControlLabelUtilityClasses: () => (/* binding */ getFormControlLabelUtilityClasses)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getFormControlLabelUtilityClasses(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiFormControlLabel', slot);\n}\nconst formControlLabelClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiFormControlLabel', ['root', 'labelPlacementStart', 'labelPlacementTop', 'labelPlacementBottom', 'disabled', 'label', 'error', 'required', 'asterisk']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (formControlLabelClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/FormControlLabel/formControlLabelClasses.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/FormControl/FormControl.js": /*!***************************************************************!*\ !*** ./node_modules/@mui/material/FormControl/FormControl.js ***! @@ -910,6 +954,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/FormGroup/FormGroup.js": +/*!***********************************************************!*\ + !*** ./node_modules/@mui/material/FormGroup/FormGroup.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _formGroupClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./formGroupClasses */ \"./node_modules/@mui/material/FormGroup/formGroupClasses.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./node_modules/@mui/material/FormControl/useFormControl.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./node_modules/@mui/material/FormControl/formControlState.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"className\", \"row\"];\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n row,\n error\n } = ownerState;\n const slots = {\n root: ['root', row && 'row', error && 'error']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(slots, _formGroupClasses__WEBPACK_IMPORTED_MODULE_6__.getFormGroupUtilityClass, classes);\n};\nconst FormGroupRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])('div', {\n name: 'MuiFormGroup',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, ownerState.row && styles.row];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'flex',\n flexDirection: 'column',\n flexWrap: 'wrap'\n}, ownerState.row && {\n flexDirection: 'row'\n}));\n\n/**\n * `FormGroup` wraps controls such as `Checkbox` and `Switch`.\n * It provides compact row layout.\n * For the `Radio`, you should be using the `RadioGroup` component instead of this one.\n */\nconst FormGroup = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function FormGroup(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_8__[\"default\"])({\n props: inProps,\n name: 'MuiFormGroup'\n });\n const {\n className,\n row = false\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const muiFormControl = (0,_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_9__[\"default\"])();\n const fcs = (0,_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n props,\n muiFormControl,\n states: ['error']\n });\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n row,\n error: fcs.error\n });\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(FormGroupRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n ownerState: ownerState,\n ref: ref\n }, other));\n});\n true ? FormGroup.propTypes /* remove-proptypes */ = {\n // ----------------------------- Warning --------------------------------\n // | These PropTypes are generated from the TypeScript type definitions |\n // | To update them edit the d.ts file and run \"yarn proptypes\" |\n // ----------------------------------------------------------------------\n /**\n * The content of the component.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().node),\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string),\n /**\n * Display group of elements in a compact row.\n * @default false\n */\n row: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().bool),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_11___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_11___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_11___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_11___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_11___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_11___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_11___default().object)])\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormGroup);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/FormGroup/FormGroup.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/FormGroup/formGroupClasses.js": +/*!******************************************************************!*\ + !*** ./node_modules/@mui/material/FormGroup/formGroupClasses.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getFormGroupUtilityClass: () => (/* binding */ getFormGroupUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getFormGroupUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiFormGroup', slot);\n}\nconst formGroupClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiFormGroup', ['root', 'row', 'error']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (formGroupClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/FormGroup/formGroupClasses.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/FormHelperText/FormHelperText.js": /*!*********************************************************************!*\ !*** ./node_modules/@mui/material/FormHelperText/FormHelperText.js ***! @@ -1911,6 +1977,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/internal/SwitchBase.js": +/*!***********************************************************!*\ + !*** ./node_modules/@mui/material/internal/SwitchBase.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/refType.js\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./node_modules/@mui/material/utils/capitalize.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useControlled */ \"./node_modules/@mui/material/utils/useControlled.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./node_modules/@mui/material/FormControl/useFormControl.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ButtonBase */ \"./node_modules/@mui/material/ButtonBase/ButtonBase.js\");\n/* harmony import */ var _switchBaseClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./switchBaseClasses */ \"./node_modules/@mui/material/internal/switchBaseClasses.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\nconst _excluded = [\"autoFocus\", \"checked\", \"checkedIcon\", \"className\", \"defaultChecked\", \"disabled\", \"disableFocusRipple\", \"edge\", \"icon\", \"id\", \"inputProps\", \"inputRef\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"readOnly\", \"required\", \"tabIndex\", \"type\", \"value\"];\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n checked,\n disabled,\n edge\n } = ownerState;\n const slots = {\n root: ['root', checked && 'checked', disabled && 'disabled', edge && `edge${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(edge)}`],\n input: ['input']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _switchBaseClasses__WEBPACK_IMPORTED_MODULE_7__.getSwitchBaseUtilityClass, classes);\n};\nconst SwitchBaseRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(_ButtonBase__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n padding: 9,\n borderRadius: '50%'\n}, ownerState.edge === 'start' && {\n marginLeft: ownerState.size === 'small' ? -3 : -12\n}, ownerState.edge === 'end' && {\n marginRight: ownerState.size === 'small' ? -3 : -12\n}));\nconst SwitchBaseInput = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('input')({\n cursor: 'inherit',\n position: 'absolute',\n opacity: 0,\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n zIndex: 1\n});\n\n/**\n * @ignore - internal component.\n */\nconst SwitchBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function SwitchBase(props, ref) {\n const {\n autoFocus,\n checked: checkedProp,\n checkedIcon,\n className,\n defaultChecked,\n disabled: disabledProp,\n disableFocusRipple = false,\n edge = false,\n icon,\n id,\n inputProps,\n inputRef,\n name,\n onBlur,\n onChange,\n onFocus,\n readOnly,\n required = false,\n tabIndex,\n type,\n value\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const [checked, setCheckedState] = (0,_utils_useControlled__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n controlled: checkedProp,\n default: Boolean(defaultChecked),\n name: 'SwitchBase',\n state: 'checked'\n });\n const muiFormControl = (0,_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const handleFocus = event => {\n if (onFocus) {\n onFocus(event);\n }\n if (muiFormControl && muiFormControl.onFocus) {\n muiFormControl.onFocus(event);\n }\n };\n const handleBlur = event => {\n if (onBlur) {\n onBlur(event);\n }\n if (muiFormControl && muiFormControl.onBlur) {\n muiFormControl.onBlur(event);\n }\n };\n const handleInputChange = event => {\n // Workaround for https://github.com/facebook/react/issues/9023\n if (event.nativeEvent.defaultPrevented) {\n return;\n }\n const newChecked = event.target.checked;\n setCheckedState(newChecked);\n if (onChange) {\n // TODO v6: remove the second argument.\n onChange(event, newChecked);\n }\n };\n let disabled = disabledProp;\n if (muiFormControl) {\n if (typeof disabled === 'undefined') {\n disabled = muiFormControl.disabled;\n }\n }\n const hasLabelFor = type === 'checkbox' || type === 'radio';\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n checked,\n disabled,\n disableFocusRipple,\n edge\n });\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(SwitchBaseRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n component: \"span\",\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n centerRipple: true,\n focusRipple: !disableFocusRipple,\n disabled: disabled,\n tabIndex: null,\n role: undefined,\n onFocus: handleFocus,\n onBlur: handleBlur,\n ownerState: ownerState,\n ref: ref\n }, other, {\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(SwitchBaseInput, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n autoFocus: autoFocus,\n checked: checkedProp,\n defaultChecked: defaultChecked,\n className: classes.input,\n disabled: disabled,\n id: hasLabelFor ? id : undefined,\n name: name,\n onChange: handleInputChange,\n readOnly: readOnly,\n ref: inputRef,\n required: required,\n ownerState: ownerState,\n tabIndex: tabIndex,\n type: type\n }, type === 'checkbox' && value === undefined ? {} : {\n value\n }, inputProps)), checked ? checkedIcon : icon]\n }));\n});\n\n// NB: If changed, please update Checkbox, Switch and Radio\n// so that the API documentation is updated.\n true ? SwitchBase.propTypes = {\n /**\n * If `true`, the `input` element is focused during the first mount.\n */\n autoFocus: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the component is checked.\n */\n checked: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * The icon to display when the component is checked.\n */\n checkedIcon: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().node).isRequired,\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n /**\n * @ignore\n */\n defaultChecked: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the component is disabled.\n */\n disabled: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the keyboard focus ripple is disabled.\n * @default false\n */\n disableFocusRipple: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If given, uses a negative margin to counteract the padding on one\n * side (this is often helpful for aligning the left or right\n * side of the icon with content above or below, without ruining the border\n * size and shape).\n * @default false\n */\n edge: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOf(['end', 'start', false]),\n /**\n * The icon to display when the component is unchecked.\n */\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().node).isRequired,\n /**\n * The id of the `input` element.\n */\n id: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n /**\n * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n */\n inputProps: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object),\n /**\n * Pass a ref to the `input` element.\n */\n inputRef: _mui_utils__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n /*\n * @ignore\n */\n name: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n /**\n * @ignore\n */\n onBlur: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * Callback fired when the state is changed.\n *\n * @param {object} event The event source of the callback.\n * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * @ignore\n */\n onFocus: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n /**\n * It prevents the user from changing the value of the field\n * (not from interacting with the field).\n */\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * If `true`, the `input` element is required.\n */\n required: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().bool),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object),\n /**\n * @ignore\n */\n tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_12___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_12___default().number), (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string)]),\n /**\n * The input component prop `type`.\n */\n type: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n /**\n * The value of the component.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().any)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SwitchBase);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/SwitchBase.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/internal/svg-icons/ArrowDropDown.js": /*!************************************************************************!*\ !*** ./node_modules/@mui/material/internal/svg-icons/ArrowDropDown.js ***! @@ -1933,6 +2010,50 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./node_modules/@mui/material/internal/svg-icons/CheckBox.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@mui/material/internal/svg-icons/CheckBox.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckBox'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/CheckBox.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/internal/svg-icons/CheckBoxOutlineBlank.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@mui/material/internal/svg-icons/CheckBoxOutlineBlank.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n}), 'CheckBoxOutlineBlank'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/CheckBoxOutlineBlank.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/internal/svg-icons/IndeterminateCheckBox.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@mui/material/internal/svg-icons/IndeterminateCheckBox.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./node_modules/@mui/material/utils/createSvgIcon.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"])( /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(\"path\", {\n d: \"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z\"\n}), 'IndeterminateCheckBox'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/IndeterminateCheckBox.js?"); + +/***/ }), + +/***/ "./node_modules/@mui/material/internal/switchBaseClasses.js": +/*!******************************************************************!*\ + !*** ./node_modules/@mui/material/internal/switchBaseClasses.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ getSwitchBaseUtilityClass: () => (/* binding */ getSwitchBaseUtilityClass)\n/* harmony export */ });\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\");\n/* harmony import */ var _generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../generateUtilityClass */ \"./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\");\n\n\nfunction getSwitchBaseUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('PrivateSwitchBase', slot);\n}\nconst switchBaseClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('PrivateSwitchBase', ['root', 'checked', 'disabled', 'input', 'edgeStart', 'edgeEnd']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (switchBaseClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/switchBaseClasses.js?"); + +/***/ }), + /***/ "./node_modules/@mui/material/node_modules/react-is/cjs/react-is.development.js": /*!**************************************************************************************!*\ !*** ./node_modules/@mui/material/node_modules/react-is/cjs/react-is.development.js ***! @@ -3326,7 +3447,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlanCtlgs: () => (/* binding */ useFilteredPlanCtlgs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор загруженных планов по поисковой фразе\nconst useFilteredPlanCtlgs = (planCtlgs, filter) => {\n const filteredPlanCtlgs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter));\n }, [planCtlgs, filter]);\n return filteredPlanCtlgs;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilteredPlanCtlgs: () => (/* binding */ useFilteredPlanCtlgs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор каталогов по поисковой фразе и наличию планов\nconst useFilteredPlanCtlgs = (planCtlgs, filter) => {\n const filteredPlanCtlgs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter.ctlgName) && (filter.haveDocs ? catalog.NCOUNT_DOCS > 0 : catalog.NCOUNT_DOCS >= 0));\n }, [planCtlgs, filter]);\n return filteredPlanCtlgs;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/hooks.js?"); /***/ }), @@ -3348,7 +3469,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgGanttDef: {},\n selectedPlanCtlgSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ACATALOG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.selectedPlanCtlgSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В каталоге планов отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n value: el,\n key: el\n }, el))))) :\n // \n null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanCtlgGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanCtlgSpecs\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\"\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"#ebecec\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) {\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n }\n //Документа\n if (num > 1 && num < 5) {\n return `${nCountDocs} ${DECLINATIONS[1]}`;\n }\n //Документ\n if (num == 1) {\n return `${nCountDocs} ${DECLINATIONS[0]}`;\n }\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }));\n }\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PLANS_LIST_ITEM_SECONDARY\n }\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgGanttDef: {},\n selectedPlanCtlgSpecs: []\n });\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveLinks: false\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ACATALOG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.selectedPlanCtlgSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В каталоге планов отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: el,\n key: el\n }, el))))) :\n // \n null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanCtlgGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanCtlgSpecs\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), -- 2.34.1 From 12bb34b0e21af67ec2f0c6cb0023534b91273066 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 26 Feb 2024 13:10:17 +0300 Subject: [PATCH 17/27] =?UTF-8?q?=D0=91=D0=94:=20BASE,=20MECHREC,=20SAMPLE?= =?UTF-8?q?S=20-=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=20PG,=20=D0=B2=20BASE=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_BASE.pck | 7 +- db/PKG_P8PANELS_MECHREC.pck | 335 ++++++++++++++---------------------- db/PKG_P8PANELS_SAMPLES.pck | 59 ++++--- 3 files changed, 168 insertions(+), 233 deletions(-) diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck index 900e224..2c621ca 100644 --- a/db/PKG_P8PANELS_BASE.pck +++ b/db/PKG_P8PANELS_BASE.pck @@ -168,7 +168,9 @@ create or replace package body PKG_P8PANELS_BASE as SRES := SDATA_TYPE_CLOB; /* Неизвестный тип данных */ else - P_EXCEPTION(0, 'Тип данных "%s" не поддерживается.', TO_CHAR(NSTD_DATA_TYPE)); + P_EXCEPTION(0, + 'Тип данных "%s" не поддерживается.', + COALESCE(TO_CHAR(NSTD_DATA_TYPE), '<НЕ ОПРЕДЕЛЁН>')); end case; /* Возвращаем результат */ return SRES; @@ -753,7 +755,7 @@ create or replace package body PKG_P8PANELS_BASE as RNODE02 => PKG_XMAKE.ELEMENT(ICURSOR => XRESP, SNAME => SRESP_TAG_SDATA_TYPE, RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XRESP, - SVALUE => STD_DATA_TYPE_TO_STR(NSTD_DATA_TYPE => RARG_VAL.DATA_TYPE))))); + SVALUE => STD_DATA_TYPE_TO_STR(NSTD_DATA_TYPE => RARG.DATA_TYPE))))); end if; /* Считываем наименование следующего параметра */ SARG_NAME := PKG_CONTPRMLOC.NEXT_(RCONTAINER => ARGS_VALS, SNAME => SARG_NAME); @@ -796,7 +798,6 @@ create or replace package body PKG_P8PANELS_BASE as XRQ_ROOT PKG_XPATH.TNODE; -- Корневой элемент тела документа запроса SRQ_ACTION PKG_STD.TSTRING; -- Код действия из запроса begin - PKG_TRACE.REGISTER(SDATA => 'P8PANELS', SDATA1 => CIN); /* Разбираем запрос */ XRQ_ROOT := RQ_ROOT_GET(CRQ => CIN); /* Считываем код действия из запроса */ diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 4f733a8..99c61c1 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -123,14 +123,14 @@ create or replace package body PKG_P8PANELS_MECHREC as and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ UR.ROLEID from USERROLES UR - where UR.AUTHID = UTILIZER) + where UR.AUTHID = UTILIZER()) union all select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ null from USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = 'CostProductPlans' - and UP.AUTHID = UTILIZER) + and UP.AUTHID = UTILIZER()) and T.PRN = P.RN) TMP connect by prior TMP.RN = TMP.UP_LEVEL start with TMP.UP_LEVEL is null; @@ -203,26 +203,7 @@ create or replace package body PKG_P8PANELS_MECHREC as NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации - STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте - CSQL clob; -- Буфер для запроса - ICURSOR integer; -- Курсор для исполнения запроса - /* Значения спецификации */ - NTASK_RN PKG_STD.TREF; -- Рег. номер спецификации - NTASK_PRN PKG_STD.TREF; -- Рег. номер родителя спецификации - STASK_PROD_ORDER PKG_STD.TSTRING; -- Заказ - DTASK_REP_DATE PKG_STD.TLDATE; -- Дата запуска - DTASK_REP_DATE_TO PKG_STD.TLDATE; -- Дата выпуска - DTASK_INCL_DATE PKG_STD.TLDATE; -- Дата включения в план - STASK_ROUTE PKG_STD.TSTRING; -- Маршрут - STASK_NOMEN_NAME PKG_STD.TSTRING; -- Наименование номенклатуры - NTASK_DEFRESLIZ number; -- Дефицит запуска - NTASK_REL_FACT number; -- Выпуск факт - NTASK_DEFSTART number; -- Дефицит выпуска - NTASK_MAIN_QUANT number; -- Выпуск - STASK_SUBDIV_DLVR PKG_STD.TSTRING; -- Сдающее подразделение - NTASK_HAVE_LINK PKG_STD.TNUMBER; -- Наличие ссылок (0 - нет, 1 - да) - NTASK_UP_LEVEL PKG_STD.TREF; -- Рег. номер родительской записи в иерархии - NTASK_LEVEL PKG_STD.TNUMBER; -- Уровень в иерархии + STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте /* Объединение значений в строковое представление */ function MAKE_INFO @@ -356,190 +337,134 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Определяем максимальный уровень иерархии */ NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN); /* Обходим данные */ - begin - CSQL := 'select TMP.*, - level NTASK_LEVEL - from (select T.RN NRN, - T.PRN NPRN, - (select PORD.NUMB from FACEACC PORD where PORD.RN = T.PROD_ORDER) SPROD_ORDER, - T.REP_DATE DREP_DATE, - T.REP_DATE_TO DREP_DATE_TO, - T.INCL_DATE DINCL_DATE, - T.ROUTE SROUTE, - D.NOMEN_NAME SNOMEN_NAME, - (T.QUANT_REST - T.START_FACT) NDEFRESLIZ, - T.REL_FACT NREL_FACT, - (T.MAIN_QUANT - T.REL_FACT) NDEFSTART, - T.MAIN_QUANT NMAIN_QUANT, - (select IDD.CODE from INS_DEPARTMENT IDD where IDD.RN = T.SUBDIV_DLVR) SSUBDIV_DLVR, - (select 1 - from DUAL - where exists - (select null - from DOCLINKS L - where L.IN_DOCUMENT = T.RN - and L.IN_UNITCODE = ''CostProductPlansSpecs'' - and (L.OUT_UNITCODE = ''CostRouteLists'' or L.OUT_UNITCODE = ''IncomFromDeps'') - and ROWNUM = 1)) NHAVE_LINK, - T.UP_LEVEL NUP_LEVEL - from FCPRODPLAN P, - FINSTATE FS, - FCPRODPLANSP T, - FCMATRESOURCE FM, - DICNOMNS D - where P.CRN = :NCRN - and P.CATEGORY = :NFCPRODPLAN_CATEGORY - and P.STATUS = :NFCPRODPLAN_STATUS - and FS.RN = P.TYPE - and FS.CODE = :SFCPRODPLAN_TYPE - and exists - (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ - null - from USERPRIV UP - where UP.JUR_PERS = P.JUR_PERS - and UP.UNITCODE = ''CostProductPlans'' - and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ - UR.ROLEID - from USERROLES UR - where UR.AUTHID = UTILIZER) - union all - select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ - null - from USERPRIV UP - where UP.JUR_PERS = P.JUR_PERS - and UP.UNITCODE = ''CostProductPlans'' - and UP.AUTHID = UTILIZER) - and T.PRN = P.RN - and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null)) - and FM.RN = T.MATRES - and D.RN = FM.NOMENCLATURE) TMP - where ((:NLEVEL is null) or ((:NLEVEL is not null) and (level <= :NLEVEL))) - connect by prior TMP.NRN = TMP.NUP_LEVEL - start with TMP.NUP_LEVEL is null - order siblings by TMP.%SORT_FIELD% asc'; - /* Подставляем поле сортировки */ - CSQL := replace(CSQL, '%SORT_FIELD%', SSORT_FIELD); - /* Разбираем его */ - ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); - PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); - /* Делаем подстановку параметров */ - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCRN', NVALUE => NCRN); - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, - SNAME => 'NFCPRODPLAN_CATEGORY', - NVALUE => NFCPRODPLAN_CATEGORY); - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLAN_STATUS', NVALUE => NFCPRODPLAN_STATUS); - PKG_SQL_DML.BIND_VARIABLE_STR(ICURSOR => ICURSOR, SNAME => 'SFCPRODPLAN_TYPE', SVALUE => SFCPRODPLAN_TYPE); - PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NLEVEL', NVALUE => NLEVEL); - /* Описываем структуру записи курсора */ - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 2); - PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); - PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4); - PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5); - PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6); - PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7); - PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 8); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12); - PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 13); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 14); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 15); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 16); - /* Делаем выборку */ - if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then - null; + for C in (select TMP.*, + level NTASK_LEVEL + from (select T.RN NRN, + T.PRN NPRN, + (select PORD.NUMB from FACEACC PORD where PORD.RN = T.PROD_ORDER) SPROD_ORDER, + T.REP_DATE DREP_DATE, + T.REP_DATE_TO DREP_DATE_TO, + T.INCL_DATE DINCL_DATE, + T.ROUTE SROUTE, + D.NOMEN_NAME SNOMEN_NAME, + (T.QUANT_REST - T.START_FACT) NDEFRESLIZ, + T.REL_FACT NREL_FACT, + (T.MAIN_QUANT - T.REL_FACT) NDEFSTART, + T.MAIN_QUANT NMAIN_QUANT, + (select IDD.CODE from INS_DEPARTMENT IDD where IDD.RN = T.SUBDIV_DLVR) SSUBDIV_DLVR, + (select 1 + from DUAL + where exists (select null + from DOCLINKS L + where L.IN_DOCUMENT = T.RN + and L.IN_UNITCODE = 'CostProductPlansSpecs' + and (L.OUT_UNITCODE = 'CostRouteLists' or L.OUT_UNITCODE = 'IncomFromDeps') + and ROWNUM = 1)) NHAVE_LINK, + T.UP_LEVEL NUP_LEVEL, + case SSORT_FIELD + when 'DREP_DATE_TO' then + T.REP_DATE_TO + else + T.REP_DATE + end DORDER_DATE + from FCPRODPLAN P, + FINSTATE FS, + FCPRODPLANSP T, + FCMATRESOURCE FM, + DICNOMNS D + where P.CRN = NCRN + and P.CATEGORY = NFCPRODPLAN_CATEGORY + and P.STATUS = NFCPRODPLAN_STATUS + and FS.RN = P.TYPE + and FS.CODE = SFCPRODPLAN_TYPE + and exists + (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER()) + union all + select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ + null + from USERPRIV UP + where UP.JUR_PERS = P.JUR_PERS + and UP.UNITCODE = 'CostProductPlans' + and UP.AUTHID = UTILIZER()) + and T.PRN = P.RN + and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null)) + and FM.RN = T.MATRES + and D.RN = FM.NOMENCLATURE) TMP + where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL))) + connect by prior TMP.NRN = TMP.NUP_LEVEL + start with TMP.NUP_LEVEL is null + order siblings by TMP.DORDER_DATE asc) + loop + /* Формируем описание задачи в Ганте */ + STASK_CAPTION := MAKE_INFO(SPROD_ORDER => C.SPROD_ORDER, + SNOMEN_NAME => C.SNOMEN_NAME, + SSUBDIV_DLVR => C.SSUBDIV_DLVR, + NMAIN_QUANT => C.NMAIN_QUANT); + /* Инициализируем даты и цвет (если необходимо) */ + FCPRODPLANSP_DATES_GET(DREP_DATE => C.DREP_DATE, + DREP_DATE_TO => C.DREP_DATE_TO, + DINCL_DATE => C.DINCL_DATE, + NHAVE_LINK => COALESCE(C.NHAVE_LINK, 0), + DDATE_FROM => DDATE_FROM, + DDATE_TO => DDATE_TO, + STASK_BG_COLOR => STASK_BG_COLOR, + STASK_TEXT_COLOR => STASK_TEXT_COLOR, + NTASK_PROGRESS => NTASK_PROGRESS); + /* Если цвет изначально не указан и требуется анализирование */ + if (STASK_BG_COLOR is null) then + /* Формирование характеристик элемента ганта */ + MAKE_GANT_ITEM(NDEFRESLIZ => C.NDEFRESLIZ, + NREL_FACT => C.NREL_FACT, + NDEFSTART => C.NDEFSTART, + STASK_BG_COLOR => STASK_BG_COLOR, + STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, + NTASK_PROGRESS => NTASK_PROGRESS); end if; - /* Обходим выбранные записи */ - while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) + /* Сформируем основную спецификацию */ + RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => C.NRN, + SNUMB => COALESCE(C.SROUTE, 'Отсутствует'), + SCAPTION => STASK_CAPTION, + SNAME => C.SNOMEN_NAME, + DSTART => DDATE_FROM, + DEND => DDATE_TO, + NPROGRESS => NTASK_PROGRESS, + SBG_COLOR => STASK_BG_COLOR, + STEXT_COLOR => STASK_TEXT_COLOR, + SBG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, + BREAD_ONLY => true, + BREAD_ONLY_DATES => true, + BREAD_ONLY_PROGRESS => true); + /* Заполним значение динамических атрибутов */ + FILL_TASK_ATTRS(RG => RG, + RGT => RGT, + SPROD_ORDER => C.SPROD_ORDER, + SSUBDIV_DLVR => C.SSUBDIV_DLVR, + NMAIN_QUANT => C.NMAIN_QUANT, + NDEFRESLIZ => C.NDEFRESLIZ, + NREL_FACT => C.NREL_FACT, + NDEFSTART => C.NDEFSTART, + NLEVEL => C.NTASK_LEVEL); + /* Собираем зависимости */ + for LINK in (select T.RN + from FCPRODPLANSP T + where T.PRN = C.NPRN + and T.UP_LEVEL = C.NRN + and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= C.NTASK_LEVEL + 1)))) loop - /* Читаем данные из курсора */ - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NTASK_RN); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NTASK_PRN); - PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 3, SVALUE => STASK_PROD_ORDER); - PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 4, DVALUE => DTASK_REP_DATE); - PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 5, DVALUE => DTASK_REP_DATE_TO); - PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 6, DVALUE => DTASK_INCL_DATE); - PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 7, SVALUE => STASK_ROUTE); - PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 8, SVALUE => STASK_NOMEN_NAME); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 9, NVALUE => NTASK_DEFRESLIZ); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NTASK_REL_FACT); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NTASK_DEFSTART); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 12, NVALUE => NTASK_MAIN_QUANT); - PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 13, SVALUE => STASK_SUBDIV_DLVR); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 14, NVALUE => NTASK_HAVE_LINK); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 15, NVALUE => NTASK_UP_LEVEL); - PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 16, NVALUE => NTASK_LEVEL); - /* Формируем описание задачи в Ганте */ - STASK_CAPTION := MAKE_INFO(SPROD_ORDER => STASK_PROD_ORDER, - SNOMEN_NAME => STASK_NOMEN_NAME, - SSUBDIV_DLVR => STASK_SUBDIV_DLVR, - NMAIN_QUANT => NTASK_MAIN_QUANT); - /* Инициализируем даты и цвет (если необходимо) */ - FCPRODPLANSP_DATES_GET(DREP_DATE => DTASK_REP_DATE, - DREP_DATE_TO => DTASK_REP_DATE_TO, - DINCL_DATE => DTASK_INCL_DATE, - NHAVE_LINK => COALESCE(NTASK_HAVE_LINK, 0), - DDATE_FROM => DDATE_FROM, - DDATE_TO => DDATE_TO, - STASK_BG_COLOR => STASK_BG_COLOR, - STASK_TEXT_COLOR => STASK_TEXT_COLOR, - NTASK_PROGRESS => NTASK_PROGRESS); - /* Если цвет изначально не указан и требуется анализирование */ - if (STASK_BG_COLOR is null) then - /* Формирование характеристик элемента ганта */ - MAKE_GANT_ITEM(NDEFRESLIZ => NTASK_DEFRESLIZ, - NREL_FACT => NTASK_REL_FACT, - NDEFSTART => NTASK_DEFSTART, - STASK_BG_COLOR => STASK_BG_COLOR, - STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, - NTASK_PROGRESS => NTASK_PROGRESS); - end if; - /* Сформируем основную спецификацию */ - RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => NTASK_RN, - SNUMB => COALESCE(STASK_ROUTE, 'Отсутствует'), - SCAPTION => STASK_CAPTION, - SNAME => STASK_NOMEN_NAME, - DSTART => DDATE_FROM, - DEND => DDATE_TO, - NPROGRESS => NTASK_PROGRESS, - SBG_COLOR => STASK_BG_COLOR, - STEXT_COLOR => STASK_TEXT_COLOR, - SBG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, - BREAD_ONLY => true, - BREAD_ONLY_DATES => true, - BREAD_ONLY_PROGRESS => true); - /* Заполним значение динамических атрибутов */ - FILL_TASK_ATTRS(RG => RG, - RGT => RGT, - SPROD_ORDER => STASK_PROD_ORDER, - SSUBDIV_DLVR => STASK_SUBDIV_DLVR, - NMAIN_QUANT => NTASK_MAIN_QUANT, - NDEFRESLIZ => NTASK_DEFRESLIZ, - NREL_FACT => NTASK_REL_FACT, - NDEFSTART => NTASK_DEFSTART, - NLEVEL => NTASK_LEVEL); - /* Собираем зависимости */ - for LINK in (select T.RN - from FCPRODPLANSP T - where T.PRN = NTASK_PRN - and T.UP_LEVEL = NTASK_RN - and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= NTASK_LEVEL + 1)))) - loop - /* Добавляем зависимости */ - PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN); - end loop; - /* Добавляем основную спецификацию в диаграмму */ - PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT); + /* Добавляем зависимости */ + PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN); end loop; - /* Освобождаем курсор */ - PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); - exception - when others then - PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); - raise; - end; + /* Добавляем основную спецификацию в диаграмму */ + PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT); + end loop; /* Формируем список */ COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG); end FCPRODPLANSP_GET; @@ -575,14 +500,14 @@ create or replace package body PKG_P8PANELS_MECHREC as and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ UR.ROLEID from USERROLES UR - where UR.AUTHID = UTILIZER) + where UR.AUTHID = UTILIZER()) union all select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */ null from USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = 'CostProductPlans' - and UP.AUTHID = UTILIZER)) as NCOUNT_DOCS + and UP.AUTHID = UTILIZER())) as NCOUNT_DOCS from ACATALOG T, UNITLIST UL where T.DOCNAME = 'CostProductPlans' diff --git a/db/PKG_P8PANELS_SAMPLES.pck b/db/PKG_P8PANELS_SAMPLES.pck index 7a0b6e6..6c4641a 100644 --- a/db/PKG_P8PANELS_SAMPLES.pck +++ b/db/PKG_P8PANELS_SAMPLES.pck @@ -74,28 +74,30 @@ create or replace package body PKG_P8PANELS_SAMPLES as NVERSION := GET_SESSION_VERSION(SUNITCODE => 'AGNLIST'); PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); PKG_XFAST.DOWN_NODE(SNAME => 'DATA'); - for C in (select D.* - from (select T.RN NRN, - T.AGNABBR SAGNABBR, - T.AGNNAME SAGNNAME - from AGNLIST T - where T.VERSION = NVERSION - and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ - null - from USERPRIV UP - where UP.CATALOG = T.CRN - and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ - UR.ROLEID - from USERROLES UR - where UR.AUTHID = UTILIZER) - union all - select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ - null - from USERPRIV UP - where UP.CATALOG = T.CRN - and UP.AUTHID = UTILIZER) - order by T.RN desc) D - where ROWNUM <= 10) + for C in (select TMP.* + from (select D.*, + ROWNUM NROWNUM + from (select T.RN NRN, + T.AGNABBR SAGNABBR, + T.AGNNAME SAGNNAME + from AGNLIST T + where T.VERSION = NVERSION + and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ + null + from USERPRIV UP + where UP.CATALOG = T.CRN + and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ + UR.ROLEID + from USERROLES UR + where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ + null + from USERPRIV UP + where UP.CATALOG = T.CRN + and UP.AUTHID = UTILIZER) + order by T.RN desc) D) TMP + where TMP.NROWNUM <= 10) loop PKG_XFAST.DOWN_NODE(SNAME => 'AGENTS'); PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => C.NRN); @@ -301,16 +303,22 @@ create or replace package body PKG_P8PANELS_SAMPLES as /* Собираем запрос */ CSQL := 'select * from (select D.*, - ROWNUM NROW + %ROWNUM% NROW from (select AG.AGNABBR SAGNABBR, AG.AGNNAME SAGNNAME, AG.AGNTYPE NAGNTYPE from AGNLIST AG - where exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ null from USERPRIV UP where UP.CATALOG = AG.CRN and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ UR.ROLEID from USERROLES UR where UR.AUTHID = UTILIZER) + where exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ null from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ UR.ROLEID from USERROLES UR where UR.AUTHID = UTILIZER()) union all - select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ null from USERPRIV UP where UP.CATALOG = AG.CRN and UP.AUTHID = UTILIZER) + select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ null from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.AUTHID = UTILIZER()) and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F where F.NROW between :NROW_FROM and :NROW_TO'; + /* Корректировка запроса под СУБД */ + if (PKG_COMPATIBLE.DATABASE_() = 0) then + CSQL := replace(csql, '%ROWNUM%', 'ROWNUM'); + else + CSQL := replace(csql, '%ROWNUM%', '(row_number() over())::numeric'); + end if; /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); /* Учтём фильтры */ @@ -331,6 +339,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 1); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; -- 2.34.1 From 7a10363a2bf82dd26909b1e15dfab6dd58c2e0c7 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 26 Feb 2024 13:15:40 +0300 Subject: [PATCH 18/27] =?UTF-8?q?WEB=20APP:=20=D0=94=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=BD=D1=8B=20=D0=B1=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D1=8B=20-P8PTable=20-=20=D1=82=D0=BE=D0=BB=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D1=82=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BA?= =?UTF-8?q?=20=D0=BF=D1=83=D1=81=D1=82=D1=8B=D0=BC=20=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=BF=D0=BF=D0=B0=D0=BC,=20P8PanelsMenu=20-=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=81=D0=BC=D0=B5=D1=82=D0=B8=D0=BA=D0=B0=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=87=D0=B8=D0=B9=20=D1=81=D1=82=D0=BE=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/p8p_panels_menu.js | 20 ++++++++++++++++---- app/components/p8p_table.js | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/components/p8p_panels_menu.js b/app/components/p8p_panels_menu.js index 145258f..458e50b 100644 --- a/app/components/p8p_panels_menu.js +++ b/app/components/p8p_panels_menu.js @@ -61,9 +61,18 @@ const STYLES = { GRID_PANEL_CARD_CONTENT_TITLE: { alignItems: "center" }, GRID_PANEL_CARD_ACTIONS: { marginTop: "auto", display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, DESKTOP_GROUP_HEADER: { fontWeight: "bold", fontFamily: "tahoma, arial, verdana, sans-serif!important", fontSize: "13px!important" }, - DESKTOP_ITEM_BUTTON: { fontSize: "12px", textTransform: "none", "&:hover": { backgroundColor: "#c3e1ff" } }, - DESKTOP_ITEM_STACK: { justifyContent: "center", alignItems: "center" }, - DESKTOP_ITEM_ICON: { width: "64px", height: "64px", fontSize: "64px" } + DESKTOP_ITEM_BUTTON: { fontSize: "12px", textTransform: "none", "&:hover": { backgroundColor: "#c3e1ff" }, maxWidth: "150px" }, + DESKTOP_ITEM_STACK: { justifyContent: "center", alignItems: "center", fontSize: "12px" }, + DESKTOP_ITEM_ICON: { width: "48px", height: "48px", fontSize: "48px" }, + DESKTOP_ITEM_CATION: { + display: "-webkit-box", + overflow: "hidden", + WebkitBoxOrient: "vertical", + WebkitLineClamp: 2, + fontSize: "12px", + maxWidth: "140px", + lineHeight: "1.2" + } }; //-------------------------------- @@ -153,10 +162,13 @@ const getPanelsLinks = ({ variant, panels, selectedPanel, group, defaultGroupTyt key={panel.name} onClick={() => (onItemNavigate ? onItemNavigate(panel) : null)} sx={STYLES.DESKTOP_ITEM_BUTTON} + title={panel.caption} > {panel.icon} - {panel.caption} + + {panel.caption} + ) diff --git a/app/components/p8p_table.js b/app/components/p8p_table.js index 4ab6149..27d970c 100644 --- a/app/components/p8p_table.js +++ b/app/components/p8p_table.js @@ -455,7 +455,7 @@ P8PTableFiltersChips.propTypes = { //Таблица const P8PTable = ({ columnsDef, - groups = [{}], + groups, rows, orders, filters, @@ -744,7 +744,7 @@ const P8PTable = ({ {rows.length > 0 - ? groups.map((group, g) => { + ? (Array.isArray(groups) && groups.length > 0 ? groups : [{}]).map((group, g) => { const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? ( -- 2.34.1 From 62b352dec20cdde8c44fb3dcac240d91c6d1085b Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 26 Feb 2024 13:17:02 +0300 Subject: [PATCH 19/27] =?UTF-8?q?WEB=20APP:=20=D0=9F=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20"=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B8=D0=BA=D0=BE=D0=B2"=20-=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=20=D1=81=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B5=D0=B9=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=81=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BD=D0=BE=D0=B9=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=D1=8E?= =?UTF-8?q?=20=D0=B1=D0=B5=D0=B7=20"=D0=B3=D1=80=D1=83=D0=BF=D0=BF",=20?= =?UTF-8?q?=D0=93=D0=B0=D0=BD=D1=82=D1=82=20-=20=D0=B4=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=81=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/samples/data_grid.js | 9 +++++---- app/panels/samples/gantt.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/panels/samples/data_grid.js b/app/panels/samples/data_grid.js index 423e9b6..8041cb7 100644 --- a/app/panels/samples/data_grid.js +++ b/app/panels/samples/data_grid.js @@ -117,10 +117,11 @@ const DataGrid = ({ title }) => { ...pv, columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], - groups: - pv.pageNumber == 1 - ? [...(data.XGROUPS || [])] - : [...pv.groups, ...(data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name)) || [])], + groups: data.XGROUPS + ? pv.pageNumber == 1 + ? [...data.XGROUPS] + : [...pv.groups, ...data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name))] + : [...pv.groups], dataLoaded: true, reload: false, morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE diff --git a/app/panels/samples/gantt.js b/app/panels/samples/gantt.js index 4883581..6ce43b9 100644 --- a/app/panels/samples/gantt.js +++ b/app/panels/samples/gantt.js @@ -20,7 +20,7 @@ import { BackEndСtx } from "../../context/backend"; //Контекст взаи //--------- //Высота диаграммы Ганта -const GANTT_HEIGHT = "600px"; +const GANTT_HEIGHT = "70vh"; //Ширина диаграммы Ганта const GANTT_WIDTH = "98vw"; -- 2.34.1 From d5beeadaf10a0711ef10e1db066e67049e9806bf Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 26 Feb 2024 13:17:18 +0300 Subject: [PATCH 20/27] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 66a870e..e48d6ce 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3260,7 +3260,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Меню панелей\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"center\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n }\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"64px\",\n height: \"64px\",\n fontSize: \"64px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), panel.caption)));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Меню панелей\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"center\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n },\n maxWidth: \"150px\"\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: \"12px\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"48px\",\n height: \"48px\",\n fontSize: \"48px\"\n },\n DESKTOP_ITEM_CATION: {\n display: \"-webkit-box\",\n overflow: \"hidden\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n fontSize: \"12px\",\n maxWidth: \"140px\",\n lineHeight: \"1.2\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON,\n title: panel.caption\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_CATION,\n variant: \"body1\"\n }, panel.caption))));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); /***/ }), @@ -3271,7 +3271,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8p_table_reducer */ \"./app/components/p8p_table_reducer.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\",\n EXPAND_TOGGLE: \"EXPAND_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any)\n});\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Панель инструментов столбца (левая)\nconst P8PTableColumnToolBarLeft = ({\n columnDef,\n onItemClick\n}) => {\n //Кнопка развёртывания/свёртывания\n let expButton = null;\n if (columnDef.expandable) expButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, columnDef.expanded ? \"indeterminate_check_box\" : \"add_box\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, expButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (левая)\nP8PTableColumnToolBarLeft.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Панель инструментов столбца (правая)\nconst P8PTableColumnToolBarRight = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if ((0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.from) || (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"filter_alt\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (правая)\nP8PTableColumnToolBarRight.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n pb: 2\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n groups = [{}],\n rows,\n orders,\n filters,\n size,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - описание заголовка\n const [header, dispatchHeaderAction] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.p8pTableReducer, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.HEADER_INITIAL_STATE)());\n\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояния - развёрнутые группы\n const [expandedGroups, setExpandedGroups] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Формирование заголовка таблицы\n const setHeader = ({\n columnsDef,\n expandable,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.SET_HEADER,\n payload: {\n columnsDef,\n expandable,\n objectsCopier\n }\n });\n\n //Сворачивание/разворачивание уровня заголовка таблицы\n const toggleHeaderExpand = ({\n columnName,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.TOGGLE_HEADER_EXPAND,\n payload: {\n columnName,\n expandable,\n objectsCopier\n }\n });\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE:\n toggleHeaderExpand({\n columnName,\n objectsCopier\n });\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //При изменении описания колонок\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setHeader({\n columnsDef,\n expandable,\n objectsCopier\n });\n }, [columnsDef, expandable, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n colSpan: header.displayDataColumnsCount,\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle\n }\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.TABLE_COLUMN_STACK\n }, group.expandable ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => {\n setExpandedGroups(pv => ({\n ...pv,\n ...{\n [group.name]: !pv[group.name]\n }\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expandedGroups[group.name] ? \"indeterminate_check_box\" : \"add_box\")) : null, customRender.data ? customRender.data : group.caption));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n component: _mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], null, header.displayLevels.map(level => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: level\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\"\n }) : null, header.displayLevelsColumns[level].map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n },\n rowSpan: columnDef.rowSpan,\n colSpan: columnDef.colSpan\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarLeft, {\n columnDef: columnDef,\n onItemClick: handleToolBarItemClick\n }), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarRight, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, rows.length > 0 ? groups.map((group, g) => {\n const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, header.displayDataColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: STYLES.TABLE_CELL_EXPAND_CONTAINER,\n colSpan: header.displayDataColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null) : null);\n return !group?.name ? rowsView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `group-${g}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : null)), rows.length == 0 ? noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null : morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnCaption)) : null));\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n parent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })).isRequired,\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8p_table_reducer */ \"./app/components/p8p_table_reducer.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\",\n EXPAND_TOGGLE: \"EXPAND_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any)\n});\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Панель инструментов столбца (левая)\nconst P8PTableColumnToolBarLeft = ({\n columnDef,\n onItemClick\n}) => {\n //Кнопка развёртывания/свёртывания\n let expButton = null;\n if (columnDef.expandable) expButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, columnDef.expanded ? \"indeterminate_check_box\" : \"add_box\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, expButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (левая)\nP8PTableColumnToolBarLeft.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Панель инструментов столбца (правая)\nconst P8PTableColumnToolBarRight = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if ((0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.from) || (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"filter_alt\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (правая)\nP8PTableColumnToolBarRight.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n pb: 2\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n groups,\n rows,\n orders,\n filters,\n size,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - описание заголовка\n const [header, dispatchHeaderAction] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.p8pTableReducer, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.HEADER_INITIAL_STATE)());\n\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояния - развёрнутые группы\n const [expandedGroups, setExpandedGroups] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Формирование заголовка таблицы\n const setHeader = ({\n columnsDef,\n expandable,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.SET_HEADER,\n payload: {\n columnsDef,\n expandable,\n objectsCopier\n }\n });\n\n //Сворачивание/разворачивание уровня заголовка таблицы\n const toggleHeaderExpand = ({\n columnName,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.TOGGLE_HEADER_EXPAND,\n payload: {\n columnName,\n expandable,\n objectsCopier\n }\n });\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE:\n toggleHeaderExpand({\n columnName,\n objectsCopier\n });\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //При изменении описания колонок\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setHeader({\n columnsDef,\n expandable,\n objectsCopier\n });\n }, [columnsDef, expandable, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n colSpan: header.displayDataColumnsCount,\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle\n }\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.TABLE_COLUMN_STACK\n }, group.expandable ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => {\n setExpandedGroups(pv => ({\n ...pv,\n ...{\n [group.name]: !pv[group.name]\n }\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expandedGroups[group.name] ? \"indeterminate_check_box\" : \"add_box\")) : null, customRender.data ? customRender.data : group.caption));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n component: _mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], null, header.displayLevels.map(level => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: level\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\"\n }) : null, header.displayLevelsColumns[level].map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n },\n rowSpan: columnDef.rowSpan,\n colSpan: columnDef.colSpan\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarLeft, {\n columnDef: columnDef,\n onItemClick: handleToolBarItemClick\n }), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarRight, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, rows.length > 0 ? (Array.isArray(groups) && groups.length > 0 ? groups : [{}]).map((group, g) => {\n const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, header.displayDataColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: STYLES.TABLE_CELL_EXPAND_CONTAINER,\n colSpan: header.displayDataColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null) : null);\n return !group?.name ? rowsView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `group-${g}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : null)), rows.length == 0 ? noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null : morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnCaption)) : null));\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n parent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })).isRequired,\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); /***/ }), @@ -3678,7 +3678,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = () => ({\n cellStyle: {\n padding: \"2px\"\n }\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n groups: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n groups: pv.pageNumber == 1 ? [...(data.XGROUPS || [])] : [...pv.groups, ...(data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name)) || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = () => ({\n cellStyle: {\n padding: \"2px\"\n }\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n groups: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n groups: data.XGROUPS ? pv.pageNumber == 1 ? [...data.XGROUPS] : [...pv.groups, ...data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name))] : [...pv.groups],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 5\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); /***/ }), @@ -3689,7 +3689,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gantt: () => (/* binding */ Gantt)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Диаграмма Ганта \"P8PGantt\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные функции\n //Диаграмма Ганта\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"600px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип задачи\"\nconst formatTaskTypeValue = value => {\n const [text, icon] = value == 0 ? [\"Этап проекта\", \"check\"] : [\"Работа проекта\", \"work_outline\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Генерация кастомных представлений атрибутов задачи в редакторе\nconst taskAttributeRenderer = ({\n task,\n attribute\n}) => {\n switch (attribute.name) {\n case \"type\":\n return formatTaskTypeValue(task.type);\n default:\n return null;\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Диаграмма Ганта \"P8Gantt\"\nconst Gantt = ({\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n dataLoaded: false,\n ident: null,\n ganttDef: {},\n ganttTasks: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных диаграммы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT\",\n args: {\n NIDENT: state.ident\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n dataLoaded: true,\n ganttDef: {\n ...data.XGANTT_DEF\n },\n ganttTasks: [...data.XGANTT_TASKS]\n }));\n }, [state.ident, executeStored]);\n\n //Инициализация данных диаграммы\n const initData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_INIT\",\n args: {\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.ident, executeStored]);\n\n //Изменение данных диаграммы\n const modifyData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n rn,\n start,\n end\n }) => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_MODIFY\",\n args: {\n NIDENT: state.ident,\n NRN: rn,\n DDATE_FROM: new Date(start),\n DDATE_TO: new Date(end)\n }\n });\n } finally {\n loadData();\n }\n }, [state.ident, executeStored, loadData]);\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyData({\n rn: task.rn,\n start,\n end\n });\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadData();\n }, [state.ident, loadData]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 0,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, state.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_2__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.ganttDef, {\n height: GANTT_HEIGHT,\n tasks: state.ganttTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : null)));\n};\n\n//Контроль свойств - Пример: Диаграмма Ганта \"P8Gantt\"\nGantt.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/gantt.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gantt: () => (/* binding */ Gantt)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Диаграмма Ганта \"P8PGantt\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные функции\n //Диаграмма Ганта\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"70vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип задачи\"\nconst formatTaskTypeValue = value => {\n const [text, icon] = value == 0 ? [\"Этап проекта\", \"check\"] : [\"Работа проекта\", \"work_outline\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n direction: \"row\",\n gap: 0.5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Генерация кастомных представлений атрибутов задачи в редакторе\nconst taskAttributeRenderer = ({\n task,\n attribute\n}) => {\n switch (attribute.name) {\n case \"type\":\n return formatTaskTypeValue(task.type);\n default:\n return null;\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Диаграмма Ганта \"P8Gantt\"\nconst Gantt = ({\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n dataLoaded: false,\n ident: null,\n ganttDef: {},\n ganttTasks: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Загрузка данных диаграммы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT\",\n args: {\n NIDENT: state.ident\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n dataLoaded: true,\n ganttDef: {\n ...data.XGANTT_DEF\n },\n ganttTasks: [...data.XGANTT_TASKS]\n }));\n }, [state.ident, executeStored]);\n\n //Инициализация данных диаграммы\n const initData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_INIT\",\n args: {\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.ident, executeStored]);\n\n //Изменение данных диаграммы\n const modifyData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n rn,\n start,\n end\n }) => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_MODIFY\",\n args: {\n NIDENT: state.ident,\n NRN: rn,\n DDATE_FROM: new Date(start),\n DDATE_TO: new Date(end)\n }\n });\n } finally {\n loadData();\n }\n }, [state.ident, executeStored, loadData]);\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyData({\n rn: task.rn,\n start,\n end\n });\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadData();\n }, [state.ident, loadData]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 0,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, state.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_2__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.ganttDef, {\n height: GANTT_HEIGHT,\n tasks: state.ganttTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : null)));\n};\n\n//Контроль свойств - Пример: Диаграмма Ганта \"P8Gantt\"\nGantt.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/gantt.js?"); /***/ }), -- 2.34.1 From 288d16c6b068b85eb8fe537ba0e0695970fb2afe Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Tue, 27 Feb 2024 12:18:24 +0300 Subject: [PATCH 21/27] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D1=80=D0=BE=D0=B8?= =?UTF-8?q?=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= =?UTF-8?q?=D0=B0=20-=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B3?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D1=81=D0=B0,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20-=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=B0?= =?UTF-8?q?=D1=82=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=92=D1=8B=D0=BF=D1=83=D1=81=D0=BA=20>=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_MECHREC.pck | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 99c61c1..cb486cb 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -47,6 +47,7 @@ create or replace package body PKG_P8PANELS_MECHREC as NDEFRESLIZ in number, -- Дефицит запуска NREL_FACT in number, -- Выпуск факт NDEFSTART in number, -- Дефицит выпуска + NMAIN_QUANT in number, -- Выпуск STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации NTASK_PROGRESS out number -- Прогресс спецификации @@ -87,7 +88,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Частично зелёный, прогресс жёлтый */ STASK_BG_COLOR := SBG_COLOR_GREEN; STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW; - NTASK_PROGRESS := 50; + NTASK_PROGRESS := ROUND(NREL_FACT / NMAIN_QUANT * 100); end if; end if; end if; @@ -131,7 +132,8 @@ create or replace package body PKG_P8PANELS_MECHREC as where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = 'CostProductPlans' and UP.AUTHID = UTILIZER()) - and T.PRN = P.RN) TMP + and T.PRN = P.RN + and T.MAIN_QUANT > 0) TMP connect by prior TMP.RN = TMP.UP_LEVEL start with TMP.UP_LEVEL is null; exception @@ -395,6 +397,7 @@ create or replace package body PKG_P8PANELS_MECHREC as and UP.UNITCODE = 'CostProductPlans' and UP.AUTHID = UTILIZER()) and T.PRN = P.RN + and T.MAIN_QUANT > 0 and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null)) and FM.RN = T.MATRES and D.RN = FM.NOMENCLATURE) TMP @@ -424,6 +427,7 @@ create or replace package body PKG_P8PANELS_MECHREC as MAKE_GANT_ITEM(NDEFRESLIZ => C.NDEFRESLIZ, NREL_FACT => C.NREL_FACT, NDEFSTART => C.NDEFSTART, + NMAIN_QUANT => C.NMAIN_QUANT, STASK_BG_COLOR => STASK_BG_COLOR, STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, NTASK_PROGRESS => NTASK_PROGRESS); @@ -457,6 +461,7 @@ create or replace package body PKG_P8PANELS_MECHREC as from FCPRODPLANSP T where T.PRN = C.NPRN and T.UP_LEVEL = C.NRN + and T.MAIN_QUANT > 0 and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= C.NTASK_LEVEL + 1)))) loop /* Добавляем зависимости */ @@ -481,7 +486,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Открываем корень */ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA'); /* Цикл по планам и отчетам производства изделий */ - for REC in (select T.RN as NRN, + for REC in (select T.RN as NRN, T.NAME as SNAME, (select count(P.RN) from FCPRODPLAN P, @@ -491,8 +496,11 @@ create or replace package body PKG_P8PANELS_MECHREC as and P.STATUS = NFCPRODPLAN_STATUS and FS.RN = P.TYPE and FS.CODE = SFCPRODPLAN_TYPE - and exists - (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ + and exists (select PSP.RN + from FCPRODPLANSP PSP + where PSP.PRN = P.RN + and PSP.MAIN_QUANT > 0) + and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ null from USERPRIV UP where UP.JUR_PERS = P.JUR_PERS -- 2.34.1 From 34924e6bc2ad4d385a558b4778010b1636e78830 Mon Sep 17 00:00:00 2001 From: Dollerino Date: Thu, 29 Feb 2024 17:00:14 +0300 Subject: [PATCH 22/27] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-807=20-=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=BF=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20"=D0=9F=D1=80=D0=BE=D0=B8?= =?UTF-8?q?=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= =?UTF-8?q?=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js | 4 ++-- 1 file changed, 2 insertions(+), 2 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 b4e2b01..dc5566e 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 @@ -163,7 +163,7 @@ PlanCtlgsList.propTypes = { planCtlgs: PropTypes.array, selectedPlanCtlg: PropTypes.number, onClick: PropTypes.func, - filter: PropTypes.string, + filter: PropTypes.object, setFilter: PropTypes.func }; @@ -189,7 +189,7 @@ const MechRecCostProdPlans = () => { selectedPlanCtlgSpecs: [] }); //Состояние для фильтра каталогов - const [filter, setFilter] = useState({ ctlgName: "", haveLinks: false }); + const [filter, setFilter] = useState({ ctlgName: "", haveDocs: false }); //Массив отфильтрованных каталогов const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter); -- 2.34.1 From ba4914d368c1b0fa7a45858936bde99c63e89c0d Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 29 Feb 2024 21:27:21 +0300 Subject: [PATCH 23/27] =?UTF-8?q?=D0=91=D0=94:=20P8PGantt=20-=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B0=20=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D0=BE=D0=BC=20(=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D0=B3=D0=B4=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_VISUAL.pck | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck index 6be69c8..342fb69 100644 --- a/db/PKG_P8PANELS_VISUAL.pck +++ b/db/PKG_P8PANELS_VISUAL.pck @@ -1805,8 +1805,7 @@ text="Формат data_grid и gant как в chart" ( RTASKS in TGANTT_TASKS -- Коллекция задач диаграммы Ганта ) - is - SDEPS PKG_STD.TLSTRING; -- Буфер для списка зависимых + is begin /* Обходим задачи из коллекции */ if ((RTASKS is not null) and (RTASKS.COUNT > 0)) then @@ -1843,14 +1842,6 @@ text="Формат data_grid и gant как в chart" if (RTASKS(I).BREAD_ONLY_PROGRESS is not null) then PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_PRGRS, BVALUE => RTASKS(I).BREAD_ONLY_PROGRESS); end if; - if ((RTASKS(I).RDEPENDENCIES is not null) and (RTASKS(I).RDEPENDENCIES.COUNT > 0)) then - SDEPS := null; - for J in RTASKS(I).RDEPENDENCIES.FIRST .. RTASKS(I).RDEPENDENCIES.LAST - loop - SDEPS := COALESCE(SDEPS, '') || 'taskId' || TO_CHAR(RTASKS(I).RDEPENDENCIES(J)) || ','; - end loop; - PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_DEPS, SVALUE => RTRIM(SDEPS, ',')); - end if; /* Динамические атрибуты */ if ((RTASKS(I).RATTR_VALS is not null) and (RTASKS(I).RATTR_VALS.COUNT > 0)) then for J in RTASKS(I).RATTR_VALS.FIRST .. RTASKS(I).RATTR_VALS.LAST @@ -1858,6 +1849,15 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.ATTR(SNAME => RTASKS(I).RATTR_VALS(J).SNAME, SVALUE => RTASKS(I).RATTR_VALS(J).SVALUE); end loop; end if; + /* Зависимости */ + if ((RTASKS(I).RDEPENDENCIES is not null) and (RTASKS(I).RDEPENDENCIES.COUNT > 0)) then + for J in RTASKS(I).RDEPENDENCIES.FIRST .. RTASKS(I).RDEPENDENCIES.LAST + loop + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASK_DEPS); + PKG_XFAST.VALUE(SVALUE => 'taskId' || TO_CHAR(RTASKS(I).RDEPENDENCIES(J))); + PKG_XFAST.UP(); + end loop; + end if; /* Закрываем задачу */ PKG_XFAST.UP(); end loop; -- 2.34.1 From 31310c3da05c83df32e7da092855c60238df1bc6 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 29 Feb 2024 21:28:59 +0300 Subject: [PATCH 24/27] =?UTF-8?q?WEBAPP:=20=D0=B5=D0=B4=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20xml2JSON?= =?UTF-8?q?=20=D0=B2=20utils.js,=20P8PGantt=20-=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=D0=B0=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B2=D1=81=D0=B5=D0=B3?= =?UTF-8?q?=D0=B4=D0=B0=20=D0=BC=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/client.js | 50 ++++++---------------------------------------- app/core/utils.js | 48 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/app/core/client.js b/app/core/client.js index dfbe3fd..7c5ac88 100644 --- a/app/core/client.js +++ b/app/core/client.js @@ -7,9 +7,10 @@ //Подключение библиотек //--------------------- -import { XMLParser, XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML +import { XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML import dayjs from "dayjs"; //Работа с датами import config from "../../app.config"; //Настройки приложения +import { xml2JSON } from "./utils"; //Вспомогательные функции //--------- //Константы @@ -34,26 +35,6 @@ const ERR_UNEXPECTED = "Неожиданный ответ сервера"; //Н const ERR_NETWORK = "Ошибка соединения с сервером"; //Ошибка сети const ERR_UNAUTH = "Сеанс завершен. Пройдите аутентификацию повторно."; //Ошибка аутентификации -//Типовые пути конвертации в массив (при переводе XML -> JSON) -const XML_ALWAYS_ARRAY_PATHS = [ - "XRESPOND.XPAYLOAD.XOUT_ARGUMENTS", - "XRESPOND.XPAYLOAD.XROWS", - "XRESPOND.XPAYLOAD.XCOLUMNS_DEF", - "XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values", - "XRESPOND.XPAYLOAD.XGROUPS", - "XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes", - "XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors", - "XRESPOND.XPAYLOAD.XGANTT_TASKS", - "XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies", - "XRESPOND.XPAYLOAD.XCHART.labels", - "XRESPOND.XPAYLOAD.XCHART.datasets", - "XRESPOND.XPAYLOAD.XCHART.datasets.data", - "XRESPOND.XPAYLOAD.XCHART.datasets.items" -]; - -//Типовой постфикс тега для массива (при переводе XML -> JSON) -const XML_ALWAYS_ARRAY_POSTFIX = "__SYSTEM__ARRAY__"; - //----------- //Тело модуля //----------- @@ -70,26 +51,8 @@ const getServerDataType = value => { const makeRespErr = ({ message }) => ({ SSTATUS: RESP_STATUS_ERR, SMESSAGE: message }); //Разбор XML -const parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => { - return new Promise((resolve, reject) => { - try { - let opts = { - ignoreDeclaration: true, - ignoreAttributes: false, - parseAttributeValue: true, - attributeNamePrefix: "" - }; - if (isArray) opts.isArray = isArray; - if (transformTagName) opts.transformTagName = transformTagName; - if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor; - if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor; - const parser = new XMLParser(opts); - resolve(parser.parse(xmlDoc)); - } catch (e) { - reject(e); - } - }); -}; +const parseXML = async (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => + await xml2JSON({ xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor, useDefaultPatterns: true }); //Формирование XML const buildXML = jsonObj => { @@ -160,7 +123,7 @@ const executeAction = async ({ serverURL, action, payload = {}, isArray, transfo throw new Error(ERR_UNEXPECTED); //Всё хорошо - возвращаем (без корня, он не нужен) console.log("SERVER RESPONSE JSON:"); - console.log(responseJSON.XRESPOND); + console.log(JSON.parse(JSON.stringify(responseJSON.XRESPOND))); return responseJSON.XRESPOND; }; @@ -192,8 +155,7 @@ const executeStored = async ({ serverURL: `${config.SYSTEM.SERVER}${!config.SYSTEM.SERVER.endsWith("/") ? "/" : ""}Process`, action: SRV_FN_CODE_EXEC_STORED, payload: { SSTORED: stored, XARGUMENTS: serverArgs, SRESP_ARG: respArg }, - isArray: (name, jPath) => - XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false), + isArray, tagValueProcessor, attributeValueProcessor }); diff --git a/app/core/utils.js b/app/core/utils.js index 69492d1..32ebd4c 100644 --- a/app/core/utils.js +++ b/app/core/utils.js @@ -30,6 +30,42 @@ const DISPLAY_SIZE = { [DISPLAY_SIZE_CODE.LG]: { WIDTH_FROM: 1200, WIDTH_TO: 1000000 } //Large - большой экран >= 1200px }; +//Типовые пути конвертации в массив (при переводе XML -> JSON) +const XML_ALWAYS_ARRAY_PATHS = [ + "XRESPOND.XPAYLOAD.XOUT_ARGUMENTS", + "XRESPOND.XPAYLOAD.XROWS", + "XRESPOND.XPAYLOAD.XCOLUMNS_DEF", + "XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values", + "XRESPOND.XPAYLOAD.XGROUPS", + "XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes", + "XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors", + "XRESPOND.XPAYLOAD.XGANTT_TASKS", + "XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies", + "XRESPOND.XPAYLOAD.XCHART.labels", + "XRESPOND.XPAYLOAD.XCHART.datasets", + "XRESPOND.XPAYLOAD.XCHART.datasets.data", + "XRESPOND.XPAYLOAD.XCHART.datasets.items" +]; + +//Типовые шаблоны конвертации в массив (при переводе XML -> JSON) +const XML_ALWAYS_ARRAY_PATH_PATTERNS = [ + /(.*)XROWS$/, + /(.*)XCOLUMNS_DEF$/, + /(.*)XCOLUMNS_DEF.values$/, + /(.*)XGROUPS$/, + /(.*)XGANTT_DEF.taskAttributes$/, + /(.*)XGANTT_DEF.taskColors$/, + /(.*)XGANTT_TASKS$/, + /(.*)XGANTT_TASKS.dependencies$/, + /(.*)XCHART.labels$/, + /(.*)XCHART.datasets$/, + /(.*)XCHART.datasets.data$/, + /(.*)XCHART.datasets.items$/ +]; + +//Типовой постфикс тега для массива (при переводе XML -> JSON) +const XML_ALWAYS_ARRAY_POSTFIX = "__SYSTEM__ARRAY__"; + //----------- //Тело модуля //----------- @@ -57,7 +93,7 @@ const object2Base64XML = (obj, builderOptions) => { }; //Конвертация XML в JSON -const xml2JSON = ({ xmlDoc, attributeValueProcessor, isArray }) => { +const xml2JSON = ({ xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor, useDefaultPatterns = true }) => { return new Promise((resolve, reject) => { try { let opts = { @@ -66,8 +102,16 @@ const xml2JSON = ({ xmlDoc, attributeValueProcessor, isArray }) => { parseAttributeValue: true, attributeNamePrefix: "" }; + if (useDefaultPatterns) + opts.isArray = (name, jPath, isLeafNode, isAttribute) => + XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || + XML_ALWAYS_ARRAY_PATH_PATTERNS.some(pattern => pattern.test(jPath)) || + jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || + (isArray ? isArray(name, jPath, isLeafNode, isAttribute) : undefined); + else if (isArray) opts.isArray = isArray; + if (transformTagName) opts.transformTagName = transformTagName; + if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor; if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor; - if (isArray) opts.isArray = isArray; const parser = new XMLParser(opts); resolve(parser.parse(xmlDoc)); } catch (e) { -- 2.34.1 From e6674f12e200f095fd3e43b699c599d29b5f26aa Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 29 Feb 2024 21:35:38 +0300 Subject: [PATCH 25/27] =?UTF-8?q?WEB=20APP:=20=D0=A1=D0=B2=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index e48d6ce..1b9749c 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3370,7 +3370,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\nconst ERR_UNAUTH = \"Сеанс завершен. Пройдите аутентификацию повторно.\"; //Ошибка аутентификации\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGROUPS\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (isArray) opts.isArray = isArray;\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Проверим на наличие редиректа к аутентификации (возникает, если сеанс окончен)\n if (response.redirected && response.url.toLowerCase().includes(\"auth?returnurl\")) throw new Error(ERR_UNAUTH);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(responseJSON.XRESPOND);\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false),\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\nconst ERR_UNAUTH = \"Сеанс завершен. Пройдите аутентификацию повторно.\"; //Ошибка аутентификации\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = async (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => await (0,_utils__WEBPACK_IMPORTED_MODULE_3__.xml2JSON)({\n xmlDoc,\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n useDefaultPatterns: true\n});\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Проверим на наличие редиректа к аутентификации (возникает, если сеанс окончен)\n if (response.redirected && response.url.toLowerCase().includes(\"auth?returnurl\")) throw new Error(ERR_UNAUTH);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(JSON.parse(JSON.stringify(responseJSON.XRESPOND)));\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray,\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); /***/ }), @@ -3381,7 +3381,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML),\n/* harmony export */ xml2JSON: () => (/* binding */ xml2JSON)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Конвертация XML в JSON\nconst xml2JSON = ({\n xmlDoc,\n attributeValueProcessor,\n isArray\n}) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n if (isArray) opts.isArray = isArray;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML),\n/* harmony export */ xml2JSON: () => (/* binding */ xml2JSON)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGROUPS\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовые шаблоны конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATH_PATTERNS = [/(.*)XROWS$/, /(.*)XCOLUMNS_DEF$/, /(.*)XCOLUMNS_DEF.values$/, /(.*)XGROUPS$/, /(.*)XGANTT_DEF.taskAttributes$/, /(.*)XGANTT_DEF.taskColors$/, /(.*)XGANTT_TASKS$/, /(.*)XGANTT_TASKS.dependencies$/, /(.*)XCHART.labels$/, /(.*)XCHART.datasets$/, /(.*)XCHART.datasets.data$/, /(.*)XCHART.datasets.items$/];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Конвертация XML в JSON\nconst xml2JSON = ({\n xmlDoc,\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n useDefaultPatterns = true\n}) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (useDefaultPatterns) opts.isArray = (name, jPath, isLeafNode, isAttribute) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || XML_ALWAYS_ARRAY_PATH_PATTERNS.some(pattern => pattern.test(jPath)) || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath, isLeafNode, isAttribute) : undefined);else if (isArray) opts.isArray = isArray;\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); /***/ }), @@ -3469,7 +3469,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\"\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"#ebecec\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) {\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n }\n //Документа\n if (num > 1 && num < 5) {\n return `${nCountDocs} ${DECLINATIONS[1]}`;\n }\n //Документ\n if (num == 1) {\n return `${nCountDocs} ${DECLINATIONS[0]}`;\n }\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }));\n }\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PLANS_LIST_ITEM_SECONDARY\n }\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgGanttDef: {},\n selectedPlanCtlgSpecs: []\n });\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveLinks: false\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ACATALOG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.selectedPlanCtlgSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В каталоге планов отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: el,\n key: el\n }, el))))) :\n // \n null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanCtlgGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanCtlgSpecs\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\"\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"#ebecec\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) {\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n }\n //Документа\n if (num > 1 && num < 5) {\n return `${nCountDocs} ${DECLINATIONS[1]}`;\n }\n //Документ\n if (num == 1) {\n return `${nCountDocs} ${DECLINATIONS[0]}`;\n }\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }));\n }\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PLANS_LIST_ITEM_SECONDARY\n }\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgGanttDef: {},\n selectedPlanCtlgSpecs: []\n });\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveDocs: false\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ACATALOG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.selectedPlanCtlgSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В каталоге планов отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n value: el,\n key: el\n }, el))))) :\n // \n null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanCtlgGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanCtlgSpecs\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), -- 2.34.1 From 8f015f6ecf628c8e7a3bf7b435ee8ff419ecd9bd Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Tue, 26 Mar 2024 16:52:04 +0300 Subject: [PATCH 26/27] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=A2=D0=9E=D0=B8=D0=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/eqs_prfrm/eqs_prfrm.js | 492 +++++++++++++++++++- app/panels/eqs_prfrm/layouts.js | 173 +++++++ dist/p8-panels.js | 723 +++++++++++++++++------------- package-lock.json | 300 ++++++++----- package.json | 5 +- 5 files changed, 1254 insertions(+), 439 deletions(-) create mode 100644 app/panels/eqs_prfrm/layouts.js diff --git a/app/panels/eqs_prfrm/eqs_prfrm.js b/app/panels/eqs_prfrm/eqs_prfrm.js index 4dc9604..aa459d0 100644 --- a/app/panels/eqs_prfrm/eqs_prfrm.js +++ b/app/panels/eqs_prfrm/eqs_prfrm.js @@ -7,7 +7,32 @@ //Подключение библиотек //--------------------- -import React from "react"; //Классы React +import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React +import { + Grid, + Paper, + Box, + Link, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + InputLabel, + FormControl, + OutlinedInput, + InputAdornment, + IconButton, + Icon, + Select, + MenuItem, + FormHelperText +} from "@mui/material"; +import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных +import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения +import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером +import { ApplicationСtx } from "../../context/application"; //Контекст приложения +import { headCellRender, dataCellRender, groupCellRender, DIGITS_REG_EXP, MONTH_NAME_REG_EXP, DAY_NAME_REG_EXP } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов //----------- //Тело модуля @@ -15,8 +40,469 @@ import React from "react"; //Классы React //Корневая панель выполнения работ const EqsPrfrm = () => { - //Генерация содержимого - return
Выполнение работ ТОиР
; + //Собственное состояние - таблица данных + const [dataGrid, setDataGrid] = useState({ + dataLoaded: false, + columnsDef: [], + groups: [], + rows: [], + reload: false + }); + + const [filter, setFilter] = useState({ + belong: "Демопример", + prodObj: "К2", + techServ: "", + respDep: "", + fromMonth: 1, + fromYear: 2024, + toMonth: 12, + toYear: 2024}); + + // const [filter, setFilter] = useState({ + // belong: "", + // prodObj: "", + // techServ: "", + // respDep: "", + // fromMonth: "", + // fromYear: "", + // toMonth: "", + // toYear: ""}); + + const [info, setInfo] = useState({cntP: 0, sumP: 0, cntF: 0, sumF: 0}); + + //Подключение к контексту приложения + const { pOnlineShowDictionary } = useContext(ApplicationСtx); + + const [filterOpen, setFilterOpen] = useState(false); + + const [filterCopy, setFilterCopy] = useState({...filter}); + + const [filterLock, setFilterLock] = useState(false); + + const openFilter = () => { + setFilterOpen(true); + }; + + const closeFilter = (e) => { + if (filterLock && e != undefined) setFilter(filterCopy); + setFilterOpen(false); + }; + + const clearFilter = () => { + setFilter({ + belong: "", + prodObj: "", + techServ: "", + respDep: "", + fromMonth: "", + fromYear: "", + toMonth: "", + toYear: ""}); + }; + + let yearArray = []; + let today = new Date(); + + const getYearArray = () => { + for (let i = 1990; i <= today.getFullYear(); i++) { + yearArray.push(i); + } + }; + + const monthArray = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]; + + //Подключение к контексту взаимодействия с сервером + const { executeStored } = useContext(BackEndСtx); + + //Загрузка данных таблицы с сервера + const loadData = useCallback(async () => { + if (dataGrid.reload) { + const data = await executeStored({ + stored: "PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID", + args: { + SBELONG: filter.belong, + SPRODOBJ: filter.prodObj, + STECHSERV: filter.techServ, + SRESPDEP: filter.respDep, + NFROMMONTH: filter.fromMonth, + NFROMYEAR: filter.fromYear, + NTOMONTH: filter.toMonth, + NTOYEAR: filter.toYear + }, + respArg: "COUT", + attributeValueProcessor: (name, val) => (["caption", "name", "parent"].includes(name) ? undefined : val) + }); + let cP = 0; + let sP = 0; + let cF = 0; + let sF = 0; + let properties = []; + if (data.XROWS != null) + { + data.XROWS.map((row) => { + properties = []; + Object.entries(row).forEach(([key, value]) => + properties.push({ name: key, data: value })); + if (properties[1].data == "Факт" || properties[2].data == "План") + { + if (properties[2].data == "План") + { + properties.map((p) => { + if (DAY_NAME_REG_EXP.test(p.name)) + cP = cP + 1; + }); + } + else if (properties[1].data == "Факт") + { + properties.map((p) => { + if (DAY_NAME_REG_EXP.test(p.name)) + cF = cF + 1; + }); + } + } + else + { + properties.map((p) => { + if (MONTH_NAME_REG_EXP.test(p.name)) + { + let str = p.data; + let m = []; + let i = 0; + while ((m = DIGITS_REG_EXP.exec(str)) != null) { + if (i == 0) + sP = sP + Number(m[0].replace(",", ".")); + else + { + sF = sF + Number(m[0].replace(",", ".")); + } + i++; + } + } + }); + } + }); + } + setInfo({cntP: cP, sumP: sP, cntF: cF, sumF: sF}); + setDataGrid(pv => ({ + ...pv, + columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, + rows: [...(data.XROWS || [])], + groups: [...(data.XGROUPS || [])], + dataLoaded: true, + reload: false + })); + } + }, [dataGrid.reload, filter, executeStored]); + + //пользовательский параметр JuridicalPerson системы + const getJurPers = useCallback(async () => { + const data = await executeStored({ + stored: "PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM", + respArg: "CRES" + }); + setFilter(pv => ({...pv, belong: data})); + }, [executeStored]); + + useEffect(() => { + if (filterOpen) + { + setFilterCopy({...filter}); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [filterOpen]) + + //При необходимости обновить данные таблицы + useEffect(() => { + loadData(); + },[loadData, dataGrid.reload]); + + //Генерация содержимого + return ( +
+ {getYearArray()} + + Фильтр отбора + theme.palette.grey[500], + }} + > + close + + + + + + Принадлежность + + { + pOnlineShowDictionary({ + unitCode: "JuridicalPersons", + callBack: res => (res.success === true ? setFilter(pv => ({...pv, belong: res.outParameters.out_CODE})) : null) + }); + }} + edge="end" + > + list + + + } + aria-describedby="belong-outlined-helper-text" + label="Принадлежность" + /> + + + {filter.belong ? null : *Обязательное поле} + + + + Значение по умолчанию + + + + + + + + Производственный объект + + { + pOnlineShowDictionary({ + unitCode: "EquipConfiguration", + callBack: res => + res.success === true ? setFilter(pv => ({...pv, prodObj: res.outParameters.out_CODE})) : null + }); + }} + edge="end" + > + list + + + } + aria-describedby="prodObj-outlined-helper-text" + label="Производственный объект" + /> + {filter.prodObj ? null : *Обязательное поле} + + + + + Техническая служба + + { + pOnlineShowDictionary({ + unitCode: "INS_DEPARTMENT", + callBack: res => + res.success === true ? setFilter(pv => ({...pv, techServ: res.outParameters.out_CODE})) : null + }); + }} + edge="end" + > + list + + + } + label="Техническая служба" + /> + + + + + Ответственное подразделение + + { + pOnlineShowDictionary({ + unitCode: "INS_DEPARTMENT", + callBack: res => + res.success === true ? setFilter(pv => ({...pv, respDep: res.outParameters.out_CODE})) : null + }); + }} + edge="end" + > + list + + + } + label="Ответственное подразделение" + /> + + + + + + Начало периода: + + + + Месяц + + {filter.fromMonth ? null : *Обязательное поле} + + + + + Год + + {filter.fromYear ? null : *Обязательное поле} + + + + + + + + Конец периода: + + + + Месяц + + {filter.toMonth ? null : *Обязательное поле} + + + + + Год + + {filter.toYear ? null : *Обязательное поле} + + + + + + + + + + + + + + Фильтр отбора: {filter.belong ? `Принадлежность: ${filter.belong}` : ""} {filter.prodObj ? `Производственный объект: ${filter.prodObj}` : ""} {filter.techServ ? `Техническая служба: ${filter.techServ}` : ""} {filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : ""} {filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? "0" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : ""} {filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? "0" + filter.toMonth : filter.toMonth}.${filter.toYear}` : ""} + + {dataGrid.dataLoaded ? ( + + + + + headCellRender({ ...prms }, + filter.techServ, + info.cntP, + info.sumP, + info.cntF, + info.sumF)} + dataCellRender={prms => dataCellRender({ ...prms })} + groupCellRender={prms => groupCellRender({ ...prms })} + showCellRightBorder={true} + /> + + + + + ) : null} +
+ ); }; //---------------- diff --git a/app/panels/eqs_prfrm/layouts.js b/app/panels/eqs_prfrm/layouts.js new file mode 100644 index 0000000..b9eba49 --- /dev/null +++ b/app/panels/eqs_prfrm/layouts.js @@ -0,0 +1,173 @@ +/* + Парус 8 - + Дополнительная разметка и вёрстка клиентских элементов +*/ + +//--------------------- +//Подключение библиотек +//--------------------- + +import { Grid, Stack } from "@mui/material"; +import React from "react"; //Классы React + +//--------- +//Константы +//--------- + +//Шаблон чисел и имён ячеек дат +export const DIGITS_REG_EXP = /\d+,?\d*/g; +export const MONTH_NAME_REG_EXP = /_\d{4}_\d{1,2}/; +export const DAY_NAME_REG_EXP = /_\d{4}_\d{1,2}_\d{1,2}/; + +let curParent = ""; +let x = 0; + +//----------- +//Тело модуля +//----------- +const formatDate = date => { + const [year, month, day] = date.substring(1).split("_"); + let nd; + if (day == null) nd = `${month < 10 ? "0" + month : month}.${year}`; + else nd = `${day < 10 ? "0" + day : day}.${month < 10 ? "0" + month : month}.${year}`; + return nd; +}; + +export const headCellRender = ({columnDef}, podr, cntP, sumP, cntF, sumF) => { + let cellStyle = {border: "1px solid rgba(0, 0, 0)", textAlign: "center"}; + let cellProps = {}; + let data = columnDef.caption; + + if (columnDef.expandable) + { + // поменять расположение + для развёртывания + } + if (columnDef.name == "STEST") + cellStyle = {display: "none"}; + if (columnDef.name == "SINFO" || columnDef.name == "SINFO2") + { + cellProps = { colSpan: 2 }; + if (columnDef.name == "SINFO") + { + cellStyle = {...cellStyle, padding: "unset"}; + data = + + + Подразделение: + + + {podr} + + + Кол-во ремонтов, план: + + + {cntP} + + + Трудоемкость, час. план: + + + {sumP} + + + Кол-во ремонтов, факт: + + + {cntF} + + + Трудоемкость, час. факт: + + + {sumF} + + + + } + } + + if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) + { + cellStyle = {...cellStyle, + paddingLeft: "5px", + paddingRight: "5px", + minWidth: "25px", + maxWidth: "25px"} + } + + return {cellStyle, cellProps, data}; +}; + +export const dataCellRender = ({ row, columnDef }) => { + let cellStyle = { + padding: "2px", + border: "1px solid rgba(0, 0, 0)", + textAlign: "center" + }; + let cellProps = {}; + let data = " "; + + if (row["SINFO2"] == undefined) { + if (columnDef.name == "STEST") cellProps = { colSpan: 2 }; + if (columnDef.name == "SINFO2") cellStyle = { display: "none" }; + if (columnDef.parent == "" && columnDef.expandable == true && columnDef.expanded == false) { + curParent = columnDef.name; + return { cellStyle: { ...cellStyle, height: "25px" }, data }; + } else if (columnDef.name != "SINFO2" && columnDef.parent != "" && columnDef.expandable == false && columnDef.expanded == true) { + if (columnDef.name.endsWith("_1")) { + curParent = columnDef.parent; + const [year, month] = curParent.substring(1).split("_"); + x = new Date(year, month, 0).getDate(); + cellProps = { colSpan: x }; + data = row[curParent]; + return { cellStyle, cellProps, data }; + } else { + cellStyle = { display: "none" }; + } + } + } + if (columnDef.name == "STEST" && row["SINFO2"] == "План") { + cellStyle = { ...cellStyle }; + cellProps = { rowSpan: 2 }; + } + if (columnDef.name == "STEST" && row["SINFO2"] == "Факт") { + cellStyle = { display: "none" }; + } + + switch (row[columnDef.name]) { + case "blue": + cellStyle = { ...cellStyle, backgroundColor: "royalblue", border: "1px solid rgba(0, 0, 0)" }; + cellProps = { title: formatDate(columnDef.name) }; + return { cellStyle, cellProps, data }; + case "green": + cellStyle = { ...cellStyle, backgroundColor: "lawngreen", border: "1px solid rgba(0, 0, 0)" }; + cellProps = { title: formatDate(columnDef.name) }; + return { cellStyle, cellProps, data }; + case "red": + cellStyle = { ...cellStyle, backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0)" }; + cellProps = { title: formatDate(columnDef.name) }; + return { cellStyle, cellProps, data }; + case "green red": + case "red green": + cellStyle = {...cellStyle, padding: "unset"}; + cellProps = { title: formatDate(columnDef.name) }; + data = + + + +

g

+
+ +

r

+
+
+
+ } + return { cellStyle, cellProps }; +}; + +export const groupCellRender = () => { + let cellStyle = { display: "none" }; + return { cellStyle }; +}; diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 27c69d5..a47e3dc 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -15,7 +15,7 @@ \***********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); +eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); /***/ }), @@ -191,40 +191,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FocusTrap: () => (/* binding */ FocusTrap)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/useForkRef/useForkRef.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/ownerDocument/ownerDocument.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/elementAcceptingRef.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/exactProp/exactProp.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n/* eslint-disable consistent-return, jsx-a11y/no-noninteractive-tabindex */\n\n\n\n\n\n// Inspired by https://github.com/focus-trap/tabbable\nconst candidatesSelector = ['input', 'select', 'textarea', 'a[href]', 'button', '[tabindex]', 'audio[controls]', 'video[controls]', '[contenteditable]:not([contenteditable=\"false\"])'].join(',');\nfunction getTabIndex(node) {\n const tabindexAttr = parseInt(node.getAttribute('tabindex') || '', 10);\n if (!Number.isNaN(tabindexAttr)) {\n return tabindexAttr;\n }\n\n // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // https://bugs.chromium.org/p/chromium/issues/detail?id=661108&q=contenteditable%20tabindex&can=2\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n // in Chrome,
,
, element.\n color: 'inherit',\n '&::-moz-focus-inner': {\n borderStyle: 'none' // Remove Firefox dotted outline.\n },\n\n [`&.${_buttonBaseClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"].disabled}`]: {\n pointerEvents: 'none',\n // Disable link interactions\n cursor: 'default'\n },\n '@media print': {\n colorAdjust: 'exact'\n }\n});\n\n/**\n * `ButtonBase` contains as few styles as possible.\n * It aims to be a simple building block for creating a button.\n * It contains a load of style reset and some focus/ripple logic.\n */\nconst ButtonBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function ButtonBase(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_8__[\"default\"])({\n props: inProps,\n name: 'MuiButtonBase'\n });\n const {\n action,\n centerRipple = false,\n children,\n className,\n component = 'button',\n disabled = false,\n disableRipple = false,\n disableTouchRipple = false,\n focusRipple = false,\n LinkComponent = 'a',\n onBlur,\n onClick,\n onContextMenu,\n onDragLeave,\n onFocus,\n onFocusVisible,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n onMouseLeave,\n onMouseUp,\n onTouchEnd,\n onTouchMove,\n onTouchStart,\n tabIndex = 0,\n TouchRippleProps,\n touchRippleRef,\n type\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, _excluded);\n const buttonRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const rippleRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const handleRippleRef = (0,_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(rippleRef, touchRippleRef);\n const {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref: focusVisibleRef\n } = (0,_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const [focusVisible, setFocusVisible] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n if (disabled && focusVisible) {\n setFocusVisible(false);\n }\n react__WEBPACK_IMPORTED_MODULE_2__.useImperativeHandle(action, () => ({\n focusVisible: () => {\n setFocusVisible(true);\n buttonRef.current.focus();\n }\n }), []);\n const [mountedState, setMountedState] = react__WEBPACK_IMPORTED_MODULE_2__.useState(false);\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n setMountedState(true);\n }, []);\n const enableTouchRipple = mountedState && !disableRipple && !disabled;\n react__WEBPACK_IMPORTED_MODULE_2__.useEffect(() => {\n if (focusVisible && focusRipple && !disableRipple && mountedState) {\n rippleRef.current.pulsate();\n }\n }, [disableRipple, focusRipple, focusVisible, mountedState]);\n function useRippleHandler(rippleAction, eventCallback, skipRippleAction = disableTouchRipple) {\n return (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(event => {\n if (eventCallback) {\n eventCallback(event);\n }\n const ignore = skipRippleAction;\n if (!ignore && rippleRef.current) {\n rippleRef.current[rippleAction](event);\n }\n return true;\n });\n }\n const handleMouseDown = useRippleHandler('start', onMouseDown);\n const handleContextMenu = useRippleHandler('stop', onContextMenu);\n const handleDragLeave = useRippleHandler('stop', onDragLeave);\n const handleMouseUp = useRippleHandler('stop', onMouseUp);\n const handleMouseLeave = useRippleHandler('stop', event => {\n if (focusVisible) {\n event.preventDefault();\n }\n if (onMouseLeave) {\n onMouseLeave(event);\n }\n });\n const handleTouchStart = useRippleHandler('start', onTouchStart);\n const handleTouchEnd = useRippleHandler('stop', onTouchEnd);\n const handleTouchMove = useRippleHandler('stop', onTouchMove);\n const handleBlur = useRippleHandler('stop', event => {\n handleBlurVisible(event);\n if (isFocusVisibleRef.current === false) {\n setFocusVisible(false);\n }\n if (onBlur) {\n onBlur(event);\n }\n }, false);\n const handleFocus = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(event => {\n // Fix for https://github.com/facebook/react/issues/7769\n if (!buttonRef.current) {\n buttonRef.current = event.currentTarget;\n }\n handleFocusVisible(event);\n if (isFocusVisibleRef.current === true) {\n setFocusVisible(true);\n if (onFocusVisible) {\n onFocusVisible(event);\n }\n }\n if (onFocus) {\n onFocus(event);\n }\n });\n const isNonNativeButton = () => {\n const button = buttonRef.current;\n return component && component !== 'button' && !(button.tagName === 'A' && button.href);\n };\n\n /**\n * IE11 shim for https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat\n */\n const keydownRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(false);\n const handleKeyDown = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(event => {\n // Check if key is already down to avoid repeats being counted as multiple activations\n if (focusRipple && !keydownRef.current && focusVisible && rippleRef.current && event.key === ' ') {\n keydownRef.current = true;\n rippleRef.current.stop(event, () => {\n rippleRef.current.start(event);\n });\n }\n if (event.target === event.currentTarget && isNonNativeButton() && event.key === ' ') {\n event.preventDefault();\n }\n if (onKeyDown) {\n onKeyDown(event);\n }\n\n // Keyboard accessibility for non interactive elements\n if (event.target === event.currentTarget && isNonNativeButton() && event.key === 'Enter' && !disabled) {\n event.preventDefault();\n if (onClick) {\n onClick(event);\n }\n }\n });\n const handleKeyUp = (0,_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(event => {\n // calling preventDefault in keyUp on a