- {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="Ответственное подразделение"
- />
-
-
-
-
-
- Начало периода:
-
-
-
- Месяц
- setFilter(pv => ({ ...pv, fromMonth: e.target.value }))}
- >
- {monthArray.map((item, i) => (
-
- {item}
-
- ))}
-
- {filter.fromMonth ? null : (
-
- *Обязательное поле
-
- )}
-
-
-
-
- Год
- setFilter(pv => ({ ...pv, fromYear: e.target.value }))}
- >
- {yearArray.map((item, i) => (
-
- {item}
-
- ))}
-
- {filter.fromYear ? null : (
-
- *Обязательное поле
-
- )}
-
-
-
-
-
-
-
- Конец периода:
-
-
-
- Месяц
- setFilter(pv => ({ ...pv, toMonth: e.target.value }))}
- >
- {monthArray.map((item, i) => (
-
- {item}
-
- ))}
-
- {filter.toMonth ? null : (
-
- *Обязательное поле
-
- )}
-
-
-
-
- Год
- setFilter(pv => ({ ...pv, toYear: e.target.value }))}
- >
- {yearArray.map((item, i) => (
-
- {item}
-
- ))}
-
- {filter.toYear ? null : (
-
- *Обязательное поле
-
- )}
-
-
-
-
-
-
-
- {
- setFilterLock(true);
- setDataGrid({ reload: true });
- closeFilter();
- }}
- >
- Сформировать
-
-
- Очистить
-
- {
- setFilter(filterCopy);
- }}
- >
- Отмена
-
-
-
+
Фильтр отбора: {filter.belong ? `Принадлежность: ${filter.belong}` : ""}{" "}
{filter.prodObj ? `Производственный объект: ${filter.prodObj}` : ""} {filter.techServ ? `Техническая служба: ${filter.techServ}` : ""}{" "}
@@ -592,9 +252,7 @@ const EqsPrfrm = () => {
rows={dataGrid.rows}
size={P8P_DATA_GRID_SIZE.LARGE}
reloading={dataGrid.reload}
- headCellRender={prms =>
- headCellRender({ ...prms }, handleClick, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF)
- }
+ headCellRender={prms => headCellRender({ ...prms }, handleClick)}
dataCellRender={prms => dataCellRender({ ...prms }, showEquipSrv)}
groupCellRender={prms => groupCellRender({ ...prms })}
showCellRightBorder={true}
diff --git a/app/panels/eqs_prfrm/filter_dialog.js b/app/panels/eqs_prfrm/filter_dialog.js
new file mode 100644
index 0000000..8786ffa
--- /dev/null
+++ b/app/panels/eqs_prfrm/filter_dialog.js
@@ -0,0 +1,257 @@
+/*
+ Парус 8 - Панели мониторинга - ТОиР - Выполнение работ
+ Панель мониторинга: Диалоговое окно фильтра отбора
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useContext, useEffect, useCallback } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Paper, Box, Grid } from "@mui/material"; //Интерфейсные компоненты
+import { FilterInputField } from "./filter_input_field"; //Компонент поля ввода
+import { ApplicationСtx } from "../../context/application"; //Контекст приложения
+import { STYLES } from "./layouts"; //Стили
+
+//---------
+//Константы
+//---------
+
+//Массив месяцев
+export const MONTH_ARRAY = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"];
+
+//---------------
+//Тело компонента
+//---------------
+
+//Диалоговое окно фильтра отбора
+const FilterDialog = props => {
+ //Свойства
+ const { filter, filterCopy, filterOpen, setFilter, setFilterOpen, setDataGrid } = props;
+
+ //Состояние ограничения редактирования фильтра
+ const [filterLock, setFilterLock] = useState(false);
+
+ //Состояние массива лет
+ const [years, setYears] = useState({ array: [1990], filled: false });
+
+ //Подключение к контексту приложения
+ const { pOnlineShowDictionary } = useContext(ApplicationСtx);
+
+ //Закрыть фильтр
+ const closeFilter = e => {
+ if (filterLock && e != undefined) setFilter(filterCopy);
+ setFilterOpen(false);
+ };
+
+ //Очистить фильтр
+ const clearFilter = () => {
+ setFilter({
+ belong: "",
+ prodObj: "",
+ techServ: "",
+ respDep: "",
+ fromMonth: "",
+ fromYear: "",
+ toMonth: "",
+ toYear: ""
+ });
+ };
+
+ //Заполнение состояния массива лет
+ const getYearArray = useCallback(async () => {
+ const today = new Date();
+ for (let i = years.array[0] + 1; i <= today.getFullYear(); i++) {
+ setYears(pv => ({ ...pv, array: [...pv.array, i] }));
+ }
+ setYears(pv => ({ ...pv, filled: true }));
+ //eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ //Только при первичном рендере
+ useEffect(() => {
+ if (filterOpen && !years.filled) getYearArray();
+ }, [filterOpen, getYearArray, years.filled]);
+
+ //Генерация содержимого
+ return (
+
+
+ Фильтр отбора
+ theme.palette.grey[500]
+ }}
+ >
+ close
+
+
+
+
+ {
+ pOnlineShowDictionary({
+ unitCode: "JuridicalPersons",
+ callBack: res =>
+ res.success === true ? setFilter(pv => ({ ...pv, belong: res.outParameters.out_CODE })) : null
+ });
+ }}
+ required={true}
+ />
+
+
+ {
+ pOnlineShowDictionary({
+ unitCode: "EquipConfiguration",
+ callBack: res =>
+ res.success === true ? setFilter(pv => ({ ...pv, prodObj: res.outParameters.out_CODE })) : null
+ });
+ }}
+ required={true}
+ />
+
+
+ {
+ pOnlineShowDictionary({
+ unitCode: "INS_DEPARTMENT",
+ callBack: res =>
+ res.success === true ? setFilter(pv => ({ ...pv, techServ: res.outParameters.out_CODE })) : null
+ });
+ }}
+ />
+
+
+ {
+ pOnlineShowDictionary({
+ unitCode: "INS_DEPARTMENT",
+ callBack: res =>
+ res.success === true ? setFilter(pv => ({ ...pv, respDep: res.outParameters.out_CODE })) : null
+ });
+ }}
+ />
+
+
+
+
+ Начало периода:
+
+
+ setFilter(pv => ({ ...pv, fromMonth: e.target.value }))}
+ required={true}
+ isDateField={true}
+ />
+
+
+ setFilter(pv => ({ ...pv, fromYear: e.target.value }))}
+ required={true}
+ isDateField={true}
+ yearArray={years.array}
+ />
+
+
+
+
+
+
+ Конец периода:
+
+
+ setFilter(pv => ({ ...pv, toMonth: e.target.value }))}
+ required={true}
+ isDateField={true}
+ />
+
+
+ setFilter(pv => ({ ...pv, toYear: e.target.value }))}
+ required={true}
+ isDateField={true}
+ yearArray={years.array}
+ />
+
+
+
+
+
+
+ {
+ setFilterLock(true);
+ setDataGrid({ reload: true });
+ closeFilter();
+ }}
+ >
+ Сформировать
+
+
+ Очистить
+
+ {
+ setFilter(filterCopy);
+ }}
+ >
+ Отмена
+
+
+
+
+ );
+};
+
+//Контроль свойств компонента - Диалоговое окно фильтра отбора
+FilterDialog.propTypes = {
+ filter: PropTypes.object.isRequired,
+ filterCopy: PropTypes.object.isRequired,
+ filterOpen: PropTypes.bool.isRequired,
+ setFilter: PropTypes.func.isRequired,
+ setFilterOpen: PropTypes.func.isRequired,
+ setDataGrid: PropTypes.func.isRequired
+};
+
+//--------------------
+//Интерфейс компонента
+//--------------------
+
+export { FilterDialog };
diff --git a/app/panels/eqs_prfrm/filter_input_field.js b/app/panels/eqs_prfrm/filter_input_field.js
new file mode 100644
index 0000000..65f6a04
--- /dev/null
+++ b/app/panels/eqs_prfrm/filter_input_field.js
@@ -0,0 +1,121 @@
+/*
+ Парус 8 - Панели мониторинга - ТОиР - Выполнение работ
+ Панель мониторинга: Компонент поля ввода
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useEffect, useState, useCallback } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { FormControl, InputLabel, Input, InputAdornment, IconButton, Icon, FormHelperText, Select, MenuItem } from "@mui/material"; //Интерфейсные компоненты
+import { MONTH_ARRAY } from "./filter_dialog"; //Название месяцев
+
+//---------------
+//Тело компонента
+//---------------
+
+//Поле ввода
+const FilterInputField = props => {
+ //Свойства
+ const { elementCode, elementValue, labelText, changeFunc, required, isDateField, yearArray } = props;
+
+ //Состояние идентификатора элемента
+ const [elementId, setElementId] = useState("");
+
+ //Формирование идентификатора элемента
+ const generateId = useCallback(async () => {
+ setElementId(!isDateField ? `${elementCode}-input` : `${elementCode}-select`);
+ }, [elementCode, isDateField]);
+
+ //При рендере поля ввода
+ useEffect(() => {
+ generateId();
+ }, [generateId]);
+
+ //Генерация поля с выбором из словаря Парус
+ const renderInput = () => {
+ return (
+
+
+ list
+
+
+ }
+ aria-describedby={`${elementId}-helper-text`}
+ label={labelText}
+ />
+ );
+ };
+
+ //Генерация поля с выпадающим списком
+ const renderSelect = () => {
+ return (
+
+ {labelText === "Месяц"
+ ? MONTH_ARRAY.map((item, i) => (
+
+ {item}
+
+ ))
+ : null}
+ {labelText === "Год"
+ ? yearArray.map(item => (
+
+ {item}
+
+ ))
+ : null}
+
+ );
+ };
+
+ //Генерация содержимого
+ return (
+
+ {labelText}
+ {isDateField ? renderSelect() : renderInput()}
+ {required && !elementValue ? (
+
+ *Обязательное поле
+
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Поле ввода
+FilterInputField.propTypes = {
+ elementCode: PropTypes.string.isRequired,
+ elementValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ labelText: PropTypes.string.isRequired,
+ changeFunc: PropTypes.func.isRequired,
+ required: PropTypes.bool,
+ isDateField: PropTypes.bool,
+ yearArray: PropTypes.arrayOf(PropTypes.number)
+};
+
+//Значения по умолчанию - Поле ввода
+FilterInputField.defaultProps = {
+ required: false,
+ isDateField: false
+};
+
+//--------------------
+//Интерфейс компонента
+//--------------------
+
+export { FilterInputField };
diff --git a/app/panels/eqs_prfrm/layouts.js b/app/panels/eqs_prfrm/layouts.js
index ac7d2ee..af12aed 100644
--- a/app/panels/eqs_prfrm/layouts.js
+++ b/app/panels/eqs_prfrm/layouts.js
@@ -1,5 +1,5 @@
/*
- Парус 8 -
+ Парус 8 - Панели мониторинга - ТОиР - Выполнение работ
Дополнительная разметка и вёрстка клиентских элементов
*/
@@ -8,7 +8,7 @@
//---------------------
import React, { createRef } from "react"; //Классы React
-import { Grid, Stack } from "@mui/material";
+import { Grid, Stack } from "@mui/material"; //Интерфейсные компоненты
//---------
//Константы
@@ -19,28 +19,39 @@ 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;
+//Стили
+export const STYLES = {
+ HIDE_CELL_STYLE: { display: "none" },
+ HCR_MAIN_STYLE: { border: "1px solid rgba(0, 0, 0)", textAlign: "center" },
+ HCR_DATE_STYLE: { padding: "5px", minWidth: "25px", maxWidth: "25px" },
+ DCR_MAIN_STYLE: { padding: "2px", border: "1px solid rgba(0, 0, 0) !important", textAlign: "center" },
+ DCR_OBJECT_INFO_STYLE: { textAlign: "right", fontWeight: "bold" },
+ DCR_PLAN_CELL_STYLE: { cursor: "pointer", backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" },
+ DCR_FACT_RELATED_CELL_STYLE: { cursor: "pointer", backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" },
+ DCR_FACT_NOT_RELATED_CELL_STYLE: { cursor: "pointer", backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" },
+ FILTER_DIALOG_ACTIONS: { justifyContent: "center" }
+};
//-----------
//Тело модуля
//-----------
-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;
+//Формирование даты полной и даты без дней из наименования ячейки
+const formatDate = dateCellName => {
+ const [year, month, day] = dateCellName.substring(1).split("_");
+ let date;
+ if (day == null) date = `${month < 10 ? "0" + month : month}.${year}`;
+ else date = `${day < 10 ? "0" + day : day}.${month < 10 ? "0" + month : month}.${year}`;
+ return date;
};
-// eslint-disable-next-line no-unused-vars
-export const headCellRender = ({ columnDef }, hClick, podr, cntP, sumP, cntF, sumF) => {
- let cellStyle = { border: "1px solid rgba(0, 0, 0)", textAlign: "center" };
+//Генерация представления заголовка колонки
+export const headCellRender = ({ columnDef }, hClick) => {
+ let cellStyle = STYLES.HCR_MAIN_STYLE;
let cellProps = {};
let stackStyle = {};
let data = columnDef.caption;
-
+ //Для разворачивающихся колонок
if (columnDef.expandable) {
const ref = createRef();
cellStyle = { ...cellStyle, padding: "5px" };
@@ -51,49 +62,51 @@ export const headCellRender = ({ columnDef }, hClick, podr, cntP, sumP, cntF, su
hClick(e, ref);
}
};
-
stackStyle = { flexDirection: "column" };
}
- if (columnDef.name == "SOBJINFO") cellStyle = { display: "none" };
+ //Скрываем ненужные колонки
+ if (columnDef.name == "SOBJINFO" || columnDef.name == "SWRKTYPE") cellStyle = STYLES.HIDE_CELL_STYLE;
+ //Объединение нужных колонок и строк
if (columnDef.name == "SINFO" || columnDef.name == "SWRKTYPE") {
cellProps = { colSpan: 2 };
if (columnDef.name == "SINFO") cellProps = { ...cellProps, rowSpan: 2 };
}
-
- if (columnDef.name == "SWRKTYPE") cellStyle = { display: "none" };
-
+ //Изменения в заголовках с датами
if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {
- cellStyle = { ...cellStyle, padding: "5px", minWidth: "25px", maxWidth: "25px" };
+ cellStyle = { ...cellStyle, ...STYLES.HCR_DATE_STYLE };
stackStyle = { justifyContent: "center" };
}
-
return { cellStyle, cellProps, stackStyle, data };
};
+//Генерация представления ячейки
export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
- let cellStyle = {
- padding: "2px",
- border: "1px solid rgba(0, 0, 0) !important",
- textAlign: "center"
- };
+ let curParent = "";
+ let cellDate;
+ let cellStyle = STYLES.DCR_MAIN_STYLE;
let cellProps = {};
let data = " ";
-
+ //Если строка с трудоёмкостью по объекту ремонта
if (row["SWRKTYPE"] == undefined) {
+ //Ячейка "Информация по объекту ремонта"
if (columnDef.name == "SOBJINFO") {
cellProps = { colSpan: 2 };
- cellStyle = { ...cellStyle, textAlign: "right", fontWeight: "bold" };
+ cellStyle = { ...cellStyle, ...STYLES.DCR_OBJECT_INFO_STYLE };
}
- if (columnDef.name == "SWRKTYPE") cellStyle = { display: "none" };
+ //Ячейка "Тип работ"
+ if (columnDef.name == "SWRKTYPE") cellStyle = STYLES.HIDE_CELL_STYLE;
+ //Ячейки колонок месяцев
if (columnDef.parent == "" && columnDef.expandable == true && columnDef.expanded == false) {
curParent = columnDef.name;
return { cellStyle: { ...cellStyle, height: "25px" }, data };
- } else if (columnDef.name != "SWRKTYPE" && columnDef.parent != "" && columnDef.expandable == false && columnDef.expanded == true) {
+ }
+ //Поиск развёрнутых месяцев
+ else if (columnDef.name != "SWRKTYPE" && 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 };
+ cellDate = new Date(year, month, 0).getDate();
+ cellProps = { colSpan: cellDate };
data = row[curParent];
return { cellStyle, cellProps, data };
} else {
@@ -101,17 +114,19 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
}
}
}
+ //Строка плана по объекту ремонта
if (columnDef.name == "SOBJINFO" && row["SWRKTYPE"] == "План") {
cellStyle = { ...cellStyle };
cellProps = { rowSpan: 2 };
}
+ //Строка факта по объекту ремонта
if (columnDef.name == "SOBJINFO" && row["SWRKTYPE"] == "Факт") {
cellStyle = { display: "none" };
}
-
+ //Закрашивание ячеек
switch (row[columnDef.name]) {
case "blue":
- cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" };
+ cellStyle = { ...cellStyle, ...STYLES.DCR_PLAN_CELL_STYLE };
cellProps = {
title: formatDate(columnDef.name),
onClick: () => {
@@ -120,7 +135,7 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
};
return { cellStyle, cellProps, data };
case "green":
- cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" };
+ cellStyle = { ...cellStyle, ...STYLES.DCR_FACT_RELATED_CELL_STYLE };
cellProps = {
title: formatDate(columnDef.name),
onClick: () => {
@@ -129,7 +144,7 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
};
return { cellStyle, cellProps, data };
case "red":
- cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" };
+ cellStyle = { ...cellStyle, ...STYLES.DCR_FACT_NOT_RELATED_CELL_STYLE };
cellProps = {
title: formatDate(columnDef.name),
onClick: () => {
@@ -137,6 +152,7 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
}
};
return { cellStyle, cellProps, data };
+ //Случай двойного закрашивания месяца
case "green red":
case "red green":
cellStyle = { ...cellStyle, padding: "unset" };
@@ -167,7 +183,9 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
return { cellStyle, cellProps };
};
+//Генерация представления заголовка группы
export const groupCellRender = () => {
- let cellStyle = { display: "none" };
+ //Скрываем все группы
+ let cellStyle = STYLES.HIDE_CELL_STYLE;
return { cellStyle };
};
diff --git a/app/panels/mech_rec_assembly_mon/components/plan_detail.js b/app/panels/mech_rec_assembly_mon/components/plan_detail.js
new file mode 100644
index 0000000..05d9df5
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/components/plan_detail.js
@@ -0,0 +1,338 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Панель мониторинга: Детализация по объекту
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useEffect, useState } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Box, Grid, Container, Button, Typography, Icon, Stack, IconButton, CircularProgress } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
+import { P8PSVG } from "../../../components/p8p_svg"; //Интерактивные изображения
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { useCostProductComposition, useProductDetailsTable } from "../hooks"; //Вспомогательные хуки
+import { ProgressBox } from "./progress_box"; //Информация по прогрессу объекта
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ BOX_INFO_MAIN: {
+ border: "1px solid",
+ borderRadius: "25px",
+ height: "35vh"
+ },
+ BOX_INFO_SUB: isMessage => ({
+ overflow: "hidden",
+ textAlign: "center",
+ width: "100%",
+ height: "100%",
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: isMessage ? "center" : "flex-start",
+ paddingLeft: "5px",
+ paddingRight: "5px",
+ ...(isMessage ? { padding: "5px" } : { paddingTop: "10px" })
+ }),
+ DETAIL_INFO: {
+ display: "flex",
+ justifyContent: "space-around",
+ alignItems: "center",
+ border: "1px solid",
+ borderRadius: "25px",
+ height: "17vh"
+ },
+ PRODUCT_SELECTOR_CONTAINER: {
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ flexDirection: "column",
+ border: "1px solid",
+ borderRadius: "25px",
+ height: "53vh",
+ marginTop: "16px"
+ },
+ PRODUCT_SELECTOR_MODEL: { width: "70%" },
+ PLAN_INFO_MAIN: {
+ display: "flex",
+ flexDirection: "column",
+ gap: "16px"
+ },
+ PLAN_INFO_SUB: {
+ display: "flex",
+ justifyContent: "space-between",
+ width: "280px",
+ borderBottom: "1px solid"
+ },
+ TABLE_DETAILS: { height: "240px" },
+ TABLE_DETAILS_HEADER_CELL: maxWidth => ({
+ padding: "2px 2px",
+ fontSize: "11px",
+ textAlign: "center",
+ lineHeight: "1rem",
+ ...(maxWidth ? { maxWidth } : {})
+ }),
+ TABLE_DETAILS_DATA_CELL: textAlign => ({ padding: "2px 2px", fontSize: "11px", ...(textAlign ? { textAlign } : {}) }),
+ TABLE_DETAILS_MORE_BUTTON: { borderRadius: "25px", height: "20px" },
+ CARD_DETAILS_CONTAINER: { minWidth: "1200px", maxWidth: "1400px" },
+ CARD_DETAILS_NAVIGATION_STACK: { width: "100%" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Информация о плане
+const PlanInfo = ({ plan }) => {
+ return (
+ <>
+
+
+
+ Номер борта:
+
+ {plan.SNUMB}
+
+
+
+ Год выпуска:
+
+ {plan.NYEAR}
+
+
+
+ >
+ );
+};
+
+//Контроль свойств - Информация о плане
+PlanInfo.propTypes = {
+ plan: PropTypes.object
+};
+
+//Модель выпуска плана
+const PlanProductCompositionModel = ({ model, products, onProductSelect }) => {
+ //При выборе детали на модели
+ const handleProductClick = ({ item }) => {
+ const product = products.find(p => p.SMODEL_ID == item.id);
+ if (product && onProductSelect) onProductSelect(product);
+ };
+
+ //Генерация содержимого
+ return (
+ <>
+
+ {model ? (
+ ({ id: p.SMODEL_ID, backgroundColor: p.SMODEL_BG_COLOR || "red", desc: p.SNAME, title: p.SNAME }))}
+ fillOpacity={"0.3"}
+ onItemClick={handleProductClick}
+ />
+ ) : (
+ Модель изделия не загружена
+ )}
+
+ >
+ );
+};
+
+//Контроль свойств - Модель выпуска плана
+PlanProductCompositionModel.propTypes = {
+ model: PropTypes.any,
+ products: PropTypes.array,
+ onProductSelect: PropTypes.func
+};
+
+//Генерация представления ячейки заголовка
+const headCellRender = ({ columnDef }) => ({
+ stackProps: { justifyContent: "center" },
+ cellStyle: STYLES.TABLE_DETAILS_HEADER_CELL(
+ ["NREMN_LABOUR", "NAPPLICABILITY"].includes(columnDef.name) ? "90px" : ["NDEFICIT"].includes(columnDef.name) ? "55px" : null
+ )
+});
+
+//Генерация заливки строки исходя от значений
+const dataCellRender = ({ row, columnDef }) => ({
+ cellStyle: STYLES.TABLE_DETAILS_DATA_CELL(["SOPERATION", "SNOMEN"].includes(columnDef.name) ? null : "center"),
+ data: row[columnDef]
+});
+
+//Таблица детализации изделия
+const ProductDetailsTable = ({ plan, product, stored, noProductMessage, noDataFoundMessage, title }) => {
+ //Собственное состояние
+ const [state, setState] = useState({ plan: null, product: null, orders: null, pageNumber: 1 });
+
+ //Собственное состояние - данные таблицы
+ const { data, isLoading } = useProductDetailsTable(state.plan, state.product, state.orders, state.pageNumber, stored);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setState(pv => ({ ...pv, orders: [...orders], pageNumber: 1 }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setState(pv => ({ ...pv, pageNumber: pv.pageNumber + 1 }));
+
+ //При изменении изделия
+ useEffect(() => {
+ setState(pv => ({ ...pv, plan, product, orders: null, pageNumber: 1 }));
+ }, [product, plan]);
+
+ //Генерация содержимого
+ return (
+
+ {!product ? (
+ {noProductMessage}
+ ) : (
+ <>
+
+
+
+ {title}
+
+
+
+ >
+ )}
+
+ );
+};
+
+//Контроль свойств - Таблица детализации изделия
+ProductDetailsTable.propTypes = {
+ plan: PropTypes.number.isRequired,
+ product: PropTypes.number,
+ stored: PropTypes.string.isRequired,
+ noProductMessage: PropTypes.string.isRequired,
+ noDataFoundMessage: PropTypes.string.isRequired,
+ title: PropTypes.string.isRequired
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Детализация по объекту
+const PlanDetail = ({ plan, disableNavigatePrev = false, disableNavigateNext = false, onNavigate, onBack }) => {
+ //Собственное состояние - данные производственных составов SVG
+ const [costProductComposition, setCostProductComposition] = useCostProductComposition(plan.NRN);
+
+ //Выбор элемента изделия
+ const setProduct = product => {
+ setCostProductComposition(pv => ({ ...pv, selectedProduct: product ? { ...product } : null }));
+ };
+
+ //При навигации между карточками
+ const handleNavigate = direction => {
+ setProduct(null);
+ if (onNavigate) onNavigate(direction);
+ };
+
+ //Формируем представление
+ return (
+
+
+
+
+ handleNavigate(-1)}>
+ navigate_before
+
+
+
+
+
+ (onBack ? onBack() : null)}>
+
+ chevron_left Назад
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ handleNavigate(1)}>
+ navigate_next
+
+
+
+
+
+ );
+};
+
+//Контроль свойств - Детализация по объекту
+PlanDetail.propTypes = {
+ plan: PropTypes.object,
+ disableNavigatePrev: PropTypes.bool,
+ disableNavigateNext: PropTypes.bool,
+ onNavigate: PropTypes.func,
+ onBack: PropTypes.func
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { PlanDetail };
diff --git a/app/panels/mech_rec_assembly_mon/components/plans_list.js b/app/panels/mech_rec_assembly_mon/components/plans_list.js
new file mode 100644
index 0000000..7debec8
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/components/plans_list.js
@@ -0,0 +1,83 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Компонент: Список планов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState } from "react"; //Классы React
+import { Container, Grid, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { PlansListItem } from "./plans_list_item"; //Элемент списка планов
+
+//---------
+//Константы
+//---------
+
+//Количество одновременно отображаемых элементов списка по умолчанию
+const DEFAULT_PAGE_SIZE = 5;
+
+//Стили
+const STYLES = {
+ PLAN_DOCUMENTS_LIST: { minWidth: "1024px" }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Список планов
+const PlansList = ({ plans, pageSize = DEFAULT_PAGE_SIZE, onItemClick }) => {
+ //Состояние прокрутки списка отображаемых планов
+ const [scroll, setScroll] = useState(0);
+
+ //Отработка нажатия на прокрутку списка планов влево
+ const handleScrollLeft = () => setScroll(pv => (pv <= 1 ? 0 : pv - 1));
+
+ //Отработка нажатия на прокрутку списка планов вправо
+ const handleScrollRight = () => setScroll(pv => (pv + pageSize >= plans.length ? pv : pv + 1));
+
+ //Сборка представления
+ return (
+
+
+
+
+ navigate_before
+
+
+ {plans.map((el, i) =>
+ i >= scroll && i < scroll + pageSize ? (
+
+ (onItemClick ? onItemClick(card, cardIndex) : null)}
+ />
+
+ ) : null
+ )}
+
+ = plans.length}>
+ navigate_next
+
+
+
+
+ );
+};
+
+//Контроль свойств - Список планов
+PlansList.propTypes = {
+ plans: PropTypes.arrayOf(PropTypes.object),
+ pageSize: PropTypes.number,
+ onItemClick: PropTypes.func
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { PlansList };
diff --git a/app/panels/mech_rec_assembly_mon/components/plans_list_item.js b/app/panels/mech_rec_assembly_mon/components/plans_list_item.js
new file mode 100644
index 0000000..d01e0be
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/components/plans_list_item.js
@@ -0,0 +1,108 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Компонент: Элемент списка планов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box, ImageList, ImageListItem, Icon } from "@mui/material"; //Интерфейсные элементы
+import { ProgressBox } from "./progress_box"; //Информация по прогрессу объекта
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: {
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ flexDirection: "column",
+ gap: "24px",
+ border: "1px solid",
+ borderRadius: "25px",
+ cursor: "pointer"
+ },
+ IMAGE_BOX: { width: "180px", height: "180px", alignItems: "center", justifyContent: "center", display: "flex" },
+ IMAGE_LIST_ITEM: { textAlign: "center" },
+ IMAGE_IMG: { width: "160px" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Изображение для элемента
+const PlansListItemImage = ({ card }) => {
+ return (
+
+
+
+ {card["BIMAGE"] ? (
+
+ ) : (
+ construction
+ )}
+
+
+
+ );
+};
+
+//Контроль свойств - Изображение для элемента
+PlansListItemImage.propTypes = {
+ card: PropTypes.object
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Элемент списка планов
+const PlansListItem = ({ card, cardIndex, onClick }) => {
+ return (
+
(onClick ? onClick(card, cardIndex) : null)}>
+
+
+
+ Номер борта
+
+ {card.SNUMB}
+
+
+
+
+ Год выпуска:
+
+
+ {card.NYEAR}
+
+
+
+ );
+};
+
+//Контроль свойств - Элемент списка планов
+PlansListItem.propTypes = {
+ card: PropTypes.object,
+ cardIndex: PropTypes.number,
+ onClick: PropTypes.func
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { PlansListItem };
diff --git a/app/panels/mech_rec_assembly_mon/components/progress_box.js b/app/panels/mech_rec_assembly_mon/components/progress_box.js
new file mode 100644
index 0000000..169ff90
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/components/progress_box.js
@@ -0,0 +1,75 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Компонент: Информация по прогрессу объекта
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box } from "@mui/material"; //Интерфейсные элементы
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ PROGRESS_BOX: (width, height) => ({
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ flexDirection: "column",
+ margin: "0px 32px",
+ borderRadius: "50%",
+ ...(width ? { width } : {}),
+ ...(height ? { height } : {})
+ })
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Информация по прогрессу объекта
+const ProgressBox = ({ progress, detail, width, height, progressVariant, detailVariant }) => {
+ //Определяем цвет тени
+ let boxShadow = "0 0 30px #d3d3d3";
+ switch (true) {
+ case progress >= 70:
+ boxShadow = "0 0 30px #21d21e66";
+ break;
+ case progress >= 40:
+ boxShadow = "0 0 30px #fddd3566";
+ break;
+ case progress >= 10:
+ boxShadow = "0 0 30px #ea5c4966";
+ break;
+ }
+
+ //Возвращаем содержимое
+ return (
+
+ {`${progress}%`}
+ {detail}
+
+ );
+};
+
+//Контроль свойств - Информация по прогрессу объекта
+ProgressBox.propTypes = {
+ progress: PropTypes.number,
+ detail: PropTypes.string,
+ width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ progressVariant: PropTypes.string,
+ detailVariant: PropTypes.string
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { ProgressBox };
diff --git a/app/panels/mech_rec_assembly_mon/hooks.js b/app/panels/mech_rec_assembly_mon/hooks.js
new file mode 100644
index 0000000..03dc372
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/hooks.js
@@ -0,0 +1,215 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Кастомные хуки
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
+import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
+
+//---------
+//Константы
+//---------
+
+//Размер страницы данных
+const DATA_GRID_PAGE_SIZE = 50;
+
+//-----------
+//Тело модуля
+//-----------
+
+//Клиентский отбор каталогов по поисковой фразе и наличию планов
+export const useFilteredPlanCtlgs = (planCtlgs, filter) => {
+ const filteredPlanCtlgs = React.useMemo(() => {
+ 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;
+};
+
+//Хук для основной таблицы панели
+const useMechRecAssemblyMon = () => {
+ //Собственное состояние
+ let [state, setState] = useState({
+ init: false,
+ showPlanList: false,
+ planCtlgs: [],
+ planCtlgsLoaded: false,
+ selectedPlanCtlg: {},
+ plans: [],
+ plansLoaded: false,
+ selectedPlan: {}
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Инициализация каталогов планов
+ const initPlanCtlgs = useCallback(async () => {
+ if (!state.init) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_AM_CTLG_INIT",
+ args: {},
+ respArg: "COUT",
+ isArray: name => name === "XFCPRODPLAN_CRNS"
+ });
+ setState(pv => ({ ...pv, init: true, planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])], planCtlgsLoaded: true }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [state.init, executeStored]);
+
+ //Получение информации о планах каталога
+ const loadPlans = useCallback(
+ async NCRN => {
+ if (NCRN) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_GET",
+ args: { NCRN: NCRN },
+ respArg: "COUT",
+ isArray: name => name === "XFCPRODPLAN_INFO"
+ });
+ setState(pv => ({ ...pv, init: true, plans: [...(data?.XFCPRODPLAN_INFO || [])], plansLoaded: true }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ },
+ [executeStored]
+ );
+
+ //Выбор каталога планов
+ const selectPlanCtlg = planCtlg => {
+ setState(pv => ({
+ ...pv,
+ selectedPlanCtlg: { ...planCtlg },
+ selectedPlan: {},
+ showPlanList: false
+ }));
+ };
+
+ //Сброс выбора каталога планов
+ const unselectPlanCtlg = () =>
+ setState(pv => ({
+ ...pv,
+ selectedPlanCtlg: {},
+ selectedPlan: {},
+ showPlanList: false
+ }));
+
+ //При подключении компонента к странице
+ useEffect(() => {
+ initPlanCtlgs();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ //При изменении каталога
+ useEffect(() => {
+ //Если каталог выбран
+ if (state.selectedPlanCtlg) {
+ loadPlans(state.selectedPlanCtlg.NRN);
+ } else {
+ setState(pv => ({ ...pv, plans: [], plansLoaded: false }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [state.selectedPlanCtlg]);
+
+ return [state, setState, selectPlanCtlg, unselectPlanCtlg];
+};
+
+//Хук для информации по производственным составам
+const useCostProductComposition = plan => {
+ //Собственное состояние
+ let [costProductComposition, setCostProductComposition] = useState({
+ showPlanList: false,
+ products: [],
+ productsLoaded: false,
+ model: null,
+ selectedProduct: null
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //При подключении компонента к странице
+ useEffect(() => {
+ const loadData = async () => {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCPRODCMP_DETAILS_GET",
+ args: { NFCPRODPLAN: plan },
+ respArg: "COUT",
+ isArray: name => name === "XFCPRODCMP"
+ });
+ setCostProductComposition(pv => ({
+ ...pv,
+ products: [...(data?.XFCPRODCMP || [])],
+ productsLoaded: true,
+ model: data?.BMODEL,
+ selectedProduct: null
+ }));
+ };
+ if (plan) loadData();
+ }, [plan, executeStored]);
+
+ //Вернём данные
+ return [costProductComposition, setCostProductComposition];
+};
+
+//Хук для таблицы детализации изделия
+const useProductDetailsTable = (plan, product, orders, pageNumber, stored) => {
+ //Собственное состояние - флаг загрузки
+ const [isLoading, setLoading] = useState(false);
+
+ //Собственное состояние - таблица данных
+ const [data, setData] = useState({
+ init: false,
+ columnsDef: [],
+ rows: [],
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных при изменении зависимостей
+ useEffect(() => {
+ const loadData = async () => {
+ try {
+ setLoading(true);
+ const data = await executeStored({
+ stored,
+ args: {
+ NPRODCMPSP: product,
+ NFCPRODPLAN: plan,
+ CORDERS: { VALUE: object2Base64XML(orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: pageNumber == 1 ? 1 : 0
+ },
+ respArg: "COUT",
+ loader: false
+ });
+ setData(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE,
+ init: true
+ }));
+ } finally {
+ setLoading(false);
+ }
+ };
+ if (plan && product) loadData();
+ }, [plan, product, orders, pageNumber, stored, executeStored, SERV_DATA_TYPE_CLOB]);
+
+ //Вернём данные
+ return { data, isLoading };
+};
+
+export { useMechRecAssemblyMon, useCostProductComposition, useProductDetailsTable };
diff --git a/app/panels/mech_rec_assembly_mon/index.js b/app/panels/mech_rec_assembly_mon/index.js
new file mode 100644
index 0000000..083b5ff
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/index.js
@@ -0,0 +1,16 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Панель мониторинга: Точка входа
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { MechRecAssemblyMon } from "./mech_rec_assembly_mon"; //Корневая панель мониторинга сборки изделий
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export const RootClass = MechRecAssemblyMon;
diff --git a/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js b/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js
new file mode 100644
index 0000000..e01f4be
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js
@@ -0,0 +1,232 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий
+ Панель мониторинга: Корневая панель мониторинга сборки изделий
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useContext } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField, FormGroup, FormControlLabel, Checkbox } from "@mui/material"; //Интерфейсные элементы
+import { ThemeProvider } from "@mui/material/styles"; //Подключение темы
+import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
+import { PlansList } from "./components/plans_list"; //Список планов
+import { PlanDetail } from "./components/plan_detail"; //Детали плана
+import { theme } from "./styles/themes"; //Стиль темы
+import { useMechRecAssemblyMon, useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки
+
+//---------
+//Константы
+//---------
+
+//Стили
+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: {
+ width: "350px",
+ display: "inline-block",
+ flexShrink: 0,
+ [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
+ },
+ PLANS_LIST_BOX: { paddingTop: "20px" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Склонения для документов
+const DECLINATIONS = ["план", "плана", "планов"];
+
+//Форматирование для отображения количества документов
+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 } = {}) => {
+ //Генерация содержимого
+ return (
+
+ {
+ setFilter(pv => ({ ...pv, ctlgName: event.target.value }));
+ }}
+ >
+
+ setFilter(pv => ({ ...pv, haveDocs: event.target.checked }))} />}
+ label="Только с планами"
+ labelPlacement="end"
+ />
+
+
+ {planCtlgs.map(p => (
+ (onClick ? onClick({ NRN: p.NRN, SNAME: p.SNAME, NMIN_YEAR: p.NMIN_YEAR, NMAX_YEAR: p.NMAX_YEAR }) : null)}
+ >
+ {p.SNAME}}
+ secondary={{formatCountDocs(p.NCOUNT_DOCS)} }
+ />
+
+ ))}
+
+
+ );
+};
+
+//Контроль свойств - Список каталогов планов
+PlanCtlgsList.propTypes = {
+ planCtlgs: PropTypes.array,
+ selectedPlanCtlg: PropTypes.number,
+ onClick: PropTypes.func,
+ filter: PropTypes.object,
+ setFilter: PropTypes.func
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Корневая панель мониторинга сборки изделий
+const MechRecAssemblyMon = () => {
+ //Собственное состояние
+ const [state, setState, selectPlanCtlg, unselectPlanCtlg] = useMechRecAssemblyMon();
+
+ //Состояние фильтра каталогов
+ const [filter, setFilter] = useState({ ctlgName: "", haveDocs: false });
+
+ //Состояние навигации по карточкам детализации
+ const [planDetailNavigation, setPlanDetailNavigation] = useState({
+ disableNavigatePrev: false,
+ disableNavigateNext: false,
+ currentPlanIndex: 0
+ });
+
+ //Массив отфильтрованных каталогов
+ const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter);
+
+ //Подключение к контексту сообщений
+ const { InlineMsgInfo } = useContext(MessagingСtx);
+
+ //Обработка нажатия на элемент в списке каталогов планов
+ const handlePlanCtlgClick = planCtlg => {
+ if (state.selectedPlanCtlg.NRN != planCtlg.NRN) selectPlanCtlg(planCtlg);
+ else unselectPlanCtlg();
+ };
+
+ //Перемещение к нужному плану
+ const navigateToPlan = planIndex => {
+ if (planIndex < 0) planIndex = 0;
+ if (planIndex > state.plans.length - 1) planIndex = state.plans.length - 1;
+ setState(pv => ({
+ ...pv,
+ selectedPlan: { ...state.plans[planIndex] }
+ }));
+ setPlanDetailNavigation(pv => ({
+ ...pv,
+ disableNavigatePrev: planIndex == 0 ? true : false,
+ disableNavigateNext: planIndex == state.plans.length - 1 ? true : false,
+ currentPlanIndex: planIndex
+ }));
+ };
+
+ //Обработка нажатия на документ плана
+ const handlePlanClick = (plan, planIndex) => navigateToPlan(planIndex);
+
+ //Обработка нажатия на кнопку "Назад"
+ const handlePlanDetailBackClick = () => {
+ setState(pv => ({ ...pv, selectedPlan: {} }));
+ };
+
+ //Обработка навигации из карточки с деталями плана
+ const handlePlanDetailNavigateClick = direction => navigateToPlan(planDetailNavigation.currentPlanIndex + direction);
+
+ //Формирование текста заголовка
+ const title = `${state.selectedPlanCtlg.SNAME} на ${state.selectedPlanCtlg.NMIN_YEAR} ${
+ state.selectedPlanCtlg.NMIN_YEAR == state.selectedPlanCtlg.NMAX_YEAR ? "г." : `- ${state.selectedPlanCtlg.NMAX_YEAR} г.г.`
+ } `;
+
+ //Генерация содержимого
+ return (
+
+
+ setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
+ Программы
+
+ setState(pv => ({ ...pv, showPlanList: false }))}
+ sx={STYLES.PLANS_DRAWER}
+ >
+
+
+ {state.init == true ? (
+ state.selectedPlanCtlg.NRN ? (
+ <>
+
+ {title}
+
+ {state.plansLoaded == true ? (
+ state.selectedPlan.NRN ? (
+
+ ) : (
+
+
+
+ )
+ ) : null}
+ >
+ ) : (
+
+ )
+ ) : null}
+
+
+ );
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { MechRecAssemblyMon };
diff --git a/app/panels/mech_rec_assembly_mon/styles/themes.js b/app/panels/mech_rec_assembly_mon/styles/themes.js
new file mode 100644
index 0000000..277aeae
--- /dev/null
+++ b/app/panels/mech_rec_assembly_mon/styles/themes.js
@@ -0,0 +1,67 @@
+import { createTheme } from "@mui/material/styles"; //Интерфейсные элементы
+
+//Описание темы
+const theme = createTheme({
+ palette: {
+ text: {
+ title: { fontColor: "rgba(0, 0, 0, 0.65)" },
+ secondary: { fontColor: "rgba(0, 0, 0, 0.298)" }
+ }
+ },
+ typography: {
+ h1: {
+ fontSize: "40px",
+ fontWeight: 400,
+ textAlign: "center"
+ },
+ h2: {
+ fontSize: "40px",
+ fontWeight: 700,
+ textAlign: "center"
+ },
+ h3: {
+ fontSize: "30px",
+ fontWeight: 700,
+ textAlign: "center"
+ },
+ h4: {
+ fontSize: "16px",
+ fontWeight: 400,
+ textAlign: "center"
+ },
+ subtitle1: {
+ fontSize: "30px",
+ fontWeight: 400,
+ textAlign: "center"
+ },
+ subtitle2: {
+ fontSize: "20px",
+ fontWeight: 700,
+ textAlign: "center"
+ },
+ UDO_body1: {
+ fontSize: "14px",
+ fontWeight: 400,
+ textAlign: "center",
+ wordWrap: "break-word",
+ letterSpacing: "0.00938em",
+ lineHeight: "1.5"
+ },
+ UDO_body2: {
+ fontSize: "12px",
+ fontWeight: 400,
+ whiteSpace: "pre-line",
+ textAlign: "center",
+ wordWrap: "break-word",
+ letterSpacing: "0.00938em",
+ lineHeight: "1.5"
+ },
+ body3: {
+ fontSize: "9px",
+ whiteSpace: "pre-line",
+ textAlign: "center"
+ }
+ }
+});
+
+export { theme };
diff --git a/app/panels/mech_rec_cost_jobs_manage/backend.js b/app/panels/mech_rec_cost_jobs_manage/backend.js
new file mode 100644
index 0000000..ee013e8
--- /dev/null
+++ b/app/panels/mech_rec_cost_jobs_manage/backend.js
@@ -0,0 +1,337 @@
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
+import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
+
+//---------
+//Константы
+//---------
+
+//Размер страницы данных
+const DATA_GRID_PAGE_SIZE = 5;
+const DATA_GRID_PAGE_FCEQUIPMENT = 10;
+
+//---------------------------------------------
+//Вспомогательные функции форматирования данных
+//---------------------------------------------
+
+//Переиницализация выбранных значений строк (необходимо при сортировке или добавлении записей строк)
+const updatingSelected = (rows, selectedRows) => {
+ //Если полученный массив строк не пустой
+ if (rows.length > 0 && selectedRows.length > 0) {
+ //Устанавливаем выбор там, где он был установлен
+ let updatedRows = rows.map(item => {
+ if (selectedRows.includes(item.NRN)) {
+ return { ...item, NSELECT: 1 };
+ } else {
+ return item;
+ }
+ });
+ return updatedRows;
+ }
+ //Возвращаем
+ return rows;
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Хук для таблицы маршрутных листов
+const useCostRouteLists = (task, processIdent) => {
+ //Собственное состояние - таблица данных
+ const [costRouteLists, setCostRouteLists] = useState({
+ task: null,
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ selectedRows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costRouteLists.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBSSP_FCROUTLST_DG_GET",
+ args: {
+ NFCJOBS: task,
+ CORDERS: { VALUE: object2Base64XML(costRouteLists.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costRouteLists.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT",
+ attributeValueProcessor: (name, val) => (["NSELECT"].includes(name) ? val === 1 : val)
+ });
+ setCostRouteLists(pv => ({
+ ...pv,
+ task: task,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows:
+ pv.pageNumber == 1
+ ? updatingSelected([...(data.XROWS || [])], costRouteLists.selectedRows)
+ : updatingSelected([...pv.rows, ...(data.XROWS || [])], costRouteLists.selectedRows),
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costRouteLists.reload,
+ costRouteLists.filters,
+ costRouteLists.orders,
+ costRouteLists.dataLoaded,
+ costRouteLists.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //Добавление/удаление записи в селектлисте
+ const modifySelectList = useCallback(
+ async prms => {
+ try {
+ if (prms.NSELECT) {
+ await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.SELECTLIST_FCROUTLST_ADD",
+ args: { NIDENT: processIdent, NFCROUTLST: prms.NFCROUTLST }
+ });
+ } else {
+ await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.SELECTLIST_FCROUTLST_DEL",
+ args: { NIDENT: processIdent, NFCROUTLST: prms.NFCROUTLST }
+ });
+ }
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [executeStored]
+ );
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costRouteLists.reload, loadData]);
+
+ //При изменении сменного задания
+ useEffect(() => {
+ setCostRouteLists(pv => ({
+ ...pv,
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ selectedRows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ }));
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [task]);
+
+ return [costRouteLists, setCostRouteLists, modifySelectList];
+};
+
+//Хук для таблицы операций
+const useCostJobsSpecs = (task, fcroutlstList, processIdent) => {
+ //Собственное состояние - таблица данных
+ const [costJobsSpecs, setCostJobsSpecs] = useState({
+ task: null,
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ selectedRows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costJobsSpecs.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBSSP_DG_GET",
+ args: {
+ NFCJOBS: task,
+ NIDENT: processIdent,
+ //SFCROUTLST_LIST: fcroutlstList.join(","),
+ CORDERS: { VALUE: object2Base64XML(costJobsSpecs.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costJobsSpecs.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costJobsSpecs.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT",
+ attributeValueProcessor: (name, val) => (["NSELECT"].includes(name) ? val === 1 : val)
+ });
+ setCostJobsSpecs(pv => ({
+ ...pv,
+ task: task,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows:
+ pv.pageNumber == 1
+ ? updatingSelected([...(data.XROWS || [])], costJobsSpecs.selectedRows)
+ : updatingSelected([...pv.rows, ...(data.XROWS || [])], costJobsSpecs.selectedRows),
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costJobsSpecs.reload,
+ costJobsSpecs.filters,
+ costJobsSpecs.orders,
+ costJobsSpecs.dataLoaded,
+ costJobsSpecs.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //Выдача задания
+ const issueCostJobsSpecs = useCallback(
+ async prms => {
+ try {
+ await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBSSP_ISSUE",
+ args: { NFCJOBS: prms.NFCJOBS, SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST }
+ });
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ },
+ [executeStored]
+ );
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costJobsSpecs.reload, loadData]);
+
+ //При изменении сменного задания
+ useEffect(() => {
+ setCostJobsSpecs(pv => ({
+ ...pv,
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ selectedRows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ }));
+ }, [task, fcroutlstList]);
+
+ return [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs];
+};
+
+//Хук для таблицы рабочих центров
+const useCostEquipment = () => {
+ //Собственное состояние - таблица данных
+ const [costEquipment, setCostEquipment] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ selectedRows: [],
+ selectedLoaded: false,
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costEquipment.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCEQUIPMENT_DG_GET",
+ args: {
+ CORDERS: { VALUE: object2Base64XML(costEquipment.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costEquipment.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_FCEQUIPMENT,
+ NINCLUDE_DEF: costEquipment.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT",
+ attributeValueProcessor: (name, val) => (["NSELECT"].includes(name) ? val === 1 : val)
+ });
+ setCostEquipment(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows:
+ pv.pageNumber == 1
+ ? updatingSelected([...(data.XROWS || [])], costEquipment.selectedRows)
+ : updatingSelected([...pv.rows, ...(data.XROWS || [])], costEquipment.selectedRows),
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_FCEQUIPMENT
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costEquipment.reload,
+ costEquipment.filters,
+ costEquipment.orders,
+ costEquipment.dataLoaded,
+ costEquipment.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //Включение оборудования в операции
+ const includeCostEquipment = useCallback(
+ async prms => {
+ try {
+ await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBSSP_INC_FCEQUIPMENT",
+ args: { NFCEQUIPMENT: prms.NFCEQUIPMENT, NFCJOBS: prms.NFCJOBS, SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST }
+ });
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ },
+ [executeStored]
+ );
+
+ //Исключение оборудования из операции
+ const excludeCostEquipment = useCallback(
+ async prms => {
+ try {
+ await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBSSP_EXC_FCEQUIPMENT",
+ args: { NFCEQUIPMENT: prms.NFCEQUIPMENT, NFCJOBS: prms.NFCJOBS, SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST }
+ });
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ },
+ [executeStored]
+ );
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costEquipment.reload, loadData]);
+
+ return [costEquipment, setCostEquipment, includeCostEquipment, excludeCostEquipment];
+};
+
+export { useCostRouteLists, useCostJobsSpecs, useCostEquipment, updatingSelected };
diff --git a/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js b/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js
new file mode 100644
index 0000000..de2c159
--- /dev/null
+++ b/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js
@@ -0,0 +1,422 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания
+ Компонент панели: Таблица информации об операциях сменного задания
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box, Checkbox, Grid, Icon, Button } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { useCostRouteLists, useCostJobsSpecs, useCostEquipment } from "./backend"; //Собственные хуки таблиц
+
+//---------
+//Константы
+//---------
+
+const sUnitCostRouteLists = "CostRouteLists"; //Мнемокод раздела маршрутных листов
+const sUnitCostJobsSpecs = "CostJobsSpecs"; //Мнемокод раздела операций
+const sUnitCostEquipment = "CostEquipment"; //Мнемокод раздела рабочих центров
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center" },
+ TABLE: { paddingTop: "15px" },
+ TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" },
+ TABLE_BUTTONS: { display: "flex", justifyContent: "flex-end" },
+ CHECK_BOX: { textAlign: "center" },
+ OPERATIONS_SEPARATOR: { padding: "3px 0px", backgroundColor: "lightblue" },
+ INFORMATION_HALF: { minWidth: "50%", maxWidth: "50%", textAlign: "center" }
+};
+
+//---------------------------------------------
+//Вспомогательные функции форматирования данных
+//---------------------------------------------
+
+//Формирование списка отмеченных записей
+function selectedReducer(accumulator, current) {
+ if (current.NSELECT == 1) {
+ accumulator.push(current.NRN);
+ }
+ return accumulator;
+}
+
+//Форматирование значения ячейки
+const dataCellRender = ({ row, columnDef, handleSelectChange, sUnit, selectedEquip }) => {
+ //Инициализируем доступность выбора
+ let disabled = false;
+ //Если это рабочие центры
+ if (sUnit === sUnitCostEquipment) {
+ //Для колонки выбора
+ if (columnDef.name === "NSELECT") {
+ return {
+ data: (
+
+ handleSelectChange(row["NRN"], sUnit, row["NCOEFF"] <= row["NLOADING"])}
+ />
+
+ )
+ };
+ }
+ //Если оборудование загружено
+ if (row["NCOEFF"] <= row["NLOADING"]) {
+ //Если поле не поле выбора
+ if (columnDef.name !== "NSELECT") {
+ return {
+ cellStyle: { color: "lightgrey" },
+ data: row[columnDef.name]
+ };
+ }
+ }
+ }
+ //Если это операции
+ if (sUnit === sUnitCostJobsSpecs) {
+ //Если "Оборудование план" операции сходится с выбранным оборудованием
+ if (selectedEquip.includes(row["NEQUIP_PLAN"])) {
+ //Если колонка выбора
+ if (columnDef.name === "NSELECT") {
+ return {
+ cellStyle: { backgroundColor: "#bce0de" },
+ data: (
+
+ handleSelectChange(row["NRN"], sUnit)}
+ />
+
+ )
+ };
+ } else {
+ return {
+ cellStyle: { backgroundColor: "#bce0de" },
+ data: row[columnDef.name]
+ };
+ }
+ }
+ }
+ //Для колонки выбора
+ if (columnDef.name === "NSELECT") {
+ return {
+ data: (
+
+ handleSelectChange(row["NRN"], sUnit)}
+ />
+
+ )
+ };
+ }
+ return {
+ data: row[columnDef.name]
+ };
+};
+
+//Генерация представления ячейки заголовка группы
+export const headCellRender = ({ columnDef }) => {
+ if (columnDef.name === "NSELECT") {
+ return {
+ stackStyle: { padding: "2px", justifyContent: "space-around" },
+ data:
done
+ };
+ } else {
+ return {
+ stackStyle: { padding: "2px" },
+ data: columnDef.caption
+ };
+ }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица информации об операциях сменного задания
+const CostJobsSpecsDataGrid = ({ task, processIdent, clearSelectlist }) => {
+ //Собственное состояние - таблица данных маршрутных листов
+ const [costRouteLists, setCostRouteLists, modifySelectList] = useCostRouteLists(task, processIdent);
+
+ //Собственное состояние - таблица данных операций
+ const [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs] = useCostJobsSpecs(task, costRouteLists.selectedRows, processIdent);
+
+ //Собственное состояние - таблица рабочих центров
+ const [costEquipment, setCostEquipment, includeCostEquipment, excludeCostEquipment] = useCostEquipment();
+
+ //При изменении состояния сортировки маршрутных листов
+ const costRouteListOrderChanged = ({ orders }) => setCostRouteLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц маршрутных листов
+ const costRouteListPagesCountChanged = () => setCostRouteLists(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //При изменении состояния сортировки операций
+ const costJobsSpecOrderChanged = ({ orders }) => setCostJobsSpecs(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц операций
+ const costJobsSpecPagesCountChanged = () => setCostJobsSpecs(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //При изменении состояния сортировки рабочих центров
+ const costEquipmentOrderChanged = ({ orders }) => setCostEquipment(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц рабочих центров
+ const costEquipmentPagesCountChanged = () => setCostEquipment(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //При включении оборудования в операции
+ const costJobsSpecIncludeCostEquipment = () => {
+ //Делаем асинхронно, чтобы при ошибке ничего не обновлять
+ const includeAsync = async () => {
+ //Включаем оборудование в операции
+ try {
+ await includeCostEquipment({
+ NFCEQUIPMENT: costEquipment.selectedRows[0],
+ NFCJOBS: task,
+ SFCJOBSSP_LIST: costJobsSpecs.selectedRows.join(";")
+ });
+ //Необходимо обновить все данные
+ setCostJobsSpecs(pv => ({ ...pv, selectedRows: [], reload: true }));
+ setCostEquipment(pv => ({ ...pv, selectedRows: [], selectedLoaded: false, reload: true }));
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ };
+ //Включаем оборудование асинхронно
+ includeAsync();
+ };
+
+ //При исключении оборудования из операции
+ const costJobsSpecExcludeCostEquipment = () => {
+ //Делаем асинхронно, чтобы при ошибке ничего не обновлять
+ const excludeAsync = async () => {
+ //Включаем оборудование в операции
+ try {
+ await excludeCostEquipment({
+ NFCEQUIPMENT: costEquipment.selectedRows[0],
+ NFCJOBS: task,
+ SFCJOBSSP_LIST: costJobsSpecs.selectedRows.join(";")
+ });
+ //Необходимо обновить данные о маршрутных листах и оборудовании
+ setCostJobsSpecs(pv => ({ ...pv, selectedRows: [], reload: true }));
+ setCostEquipment(pv => ({ ...pv, selectedRows: [], reload: true }));
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ };
+ //Исключаем операции асинхронно
+ excludeAsync();
+ };
+
+ //Выдача задания операции
+ const costJobsSpecIssue = () => {
+ //Делаем асинхронно, чтобы при ошибке ничего не обновлять
+ const issueAsync = async () => {
+ //Включаем оборудование в операции
+ try {
+ await issueCostJobsSpecs({
+ NFCJOBS: task,
+ SFCJOBSSP_LIST: costJobsSpecs.selectedRows.join(";")
+ });
+ //Необходимо обновить данные о маршрутных листах и оборудовании
+ clearSelectlist(processIdent);
+ setCostRouteLists(pv => ({ ...pv, selectedRows: [], reload: true }));
+ setCostEquipment(pv => ({ ...pv, selectedRows: [], reload: true }));
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ };
+ //Выдаем задание асинхронно
+ issueAsync();
+ };
+
+ //При изменение состояния выбора
+ const handleSelectChange = (NRN, sUnit, selectedLoaded) => {
+ //Инициализируем строки таблицы
+ let rows = [];
+ //Индекс элемента в массиве
+ let indexRow = null;
+ //Исходим от раздела
+ switch (sUnit) {
+ //Маршрутные листы
+ case sUnitCostRouteLists:
+ //Инициализируем маршрутными листами
+ rows = costRouteLists.rows;
+ //Определяем индекс элемента в массиве
+ indexRow = rows.findIndex(obj => obj.NRN == NRN);
+ //Изменяем значение выбора
+ rows[indexRow].NSELECT = !rows[indexRow].NSELECT;
+ //Добавляем/удаляем маршрутный лист из селектлиста
+ modifySelectList({ NFCROUTLST: NRN, NSELECT: rows[indexRow].NSELECT });
+ //Актуализируем строки
+ setCostRouteLists(pv => ({ ...pv, rows: rows, selectedRows: rows.reduce(selectedReducer, []) }));
+ //Выходим
+ break;
+ //Операции
+ case sUnitCostJobsSpecs:
+ //Инициализируем операциями
+ rows = costJobsSpecs.rows;
+ //Определяем индекс элемента в массиве
+ indexRow = rows.findIndex(obj => obj.NRN == NRN);
+ //Изменяем значение выбора
+ rows[indexRow].NSELECT = !rows[indexRow].NSELECT;
+ //Актуализируем строки
+ setCostJobsSpecs(pv => ({ ...pv, rows: rows, selectedRows: rows.reduce(selectedReducer, []) }));
+ //Выходим
+ break;
+ //Рабочие центры
+ case sUnitCostEquipment:
+ //Инициализируем рабочими центрами
+ rows = costEquipment.rows;
+ //Определяем индекс элемента в массиве
+ indexRow = rows.findIndex(obj => obj.NRN == NRN);
+ //Изменяем значение выбора
+ rows[indexRow].NSELECT = !rows[indexRow].NSELECT;
+ //Актуализируем строки
+ setCostEquipment(pv => ({ ...pv, rows: rows, selectedRows: rows.reduce(selectedReducer, []), selectedLoaded: selectedLoaded }));
+ //Выходим
+ break;
+ default:
+ return;
+ }
+ };
+
+ //Генерация содержимого
+ return (
+
+
+
+ Маршрутные листы
+ {costRouteLists.dataLoaded ? (
+ <>
+
+
+ Выдать задания
+
+
+
+ dataCellRender({ ...prms, handleSelectChange, sUnit: sUnitCostRouteLists })}
+ headCellRender={prms => headCellRender({ ...prms })}
+ />
+ {costRouteLists.selectedRows.length > 0 ? (
+ <>
+ Операции выбранных маршрутных листов
+
+ dataCellRender({
+ ...prms,
+ handleSelectChange,
+ sUnit: sUnitCostJobsSpecs,
+ selectedEquip: costEquipment.selectedRows
+ })
+ }
+ headCellRender={prms => headCellRender({ ...prms })}
+ />
+ >
+ ) : null}
+
+ >
+ ) : null}
+
+
+ Рабочие центры
+ {costEquipment.dataLoaded ? (
+ <>
+
+
+ Включить в задание
+
+
+
+ Исключить из задания
+
+
+
+
+
+ dataCellRender({
+ ...prms,
+ handleSelectChange,
+ sUnit: sUnitCostEquipment,
+ selectedEquip: costEquipment.selectedRows
+ })
+ }
+ headCellRender={prms => headCellRender({ ...prms })}
+ />
+
+ >
+ ) : null}
+
+
+
+ );
+};
+
+//Контроль свойств - Таблица информации об операциях сменного задания
+CostJobsSpecsDataGrid.propTypes = {
+ task: PropTypes.number.isRequired,
+ processIdent: PropTypes.number,
+ clearSelectlist: PropTypes.func
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CostJobsSpecsDataGrid };
diff --git a/app/panels/mech_rec_cost_jobs_manage/hooks.js b/app/panels/mech_rec_cost_jobs_manage/hooks.js
new file mode 100644
index 0000000..76b4637
--- /dev/null
+++ b/app/panels/mech_rec_cost_jobs_manage/hooks.js
@@ -0,0 +1,23 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания
+ Кастомные хуки
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+
+//-----------
+//Тело модуля
+//-----------
+
+//Клиентский отбор сменных заданий по поисковой фразе
+export const useFilteredFcjobs = (jobs, filter) => {
+ const filteredJobs = React.useMemo(() => {
+ return jobs.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.jobName));
+ }, [jobs, filter]);
+
+ return filteredJobs;
+};
diff --git a/app/panels/mech_rec_cost_jobs_manage/index.js b/app/panels/mech_rec_cost_jobs_manage/index.js
new file mode 100644
index 0000000..4e787b9
--- /dev/null
+++ b/app/panels/mech_rec_cost_jobs_manage/index.js
@@ -0,0 +1,16 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания
+ Панель мониторинга: Точка входа
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { MechRecCostJobs } from "./mech_rec_cost_jobs_manage"; //Корневая панель выдачи сменного задания
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export const RootClass = MechRecCostJobs;
diff --git a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js
new file mode 100644
index 0000000..d2d2e84
--- /dev/null
+++ b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js
@@ -0,0 +1,205 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания
+ Панель мониторинга: Корневая панель выдачи сменного задания
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField } from "@mui/material"; //Интерфейсные элементы
+import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
+import { useFilteredFcjobs } from "./hooks"; //Вспомогательные хуки
+import { CostJobsSpecsDataGrid } from "./fcjobssp"; //Собственные хуки таблиц
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ JOBS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" },
+ JOBS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" },
+ JOBS_BUTTON: { position: "absolute" },
+ JOBS_DRAWER: {
+ width: "350px",
+ display: "inline-block",
+ flexShrink: 0,
+ [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
+ },
+ CONTAINER: { margin: "5px 0px", textAlign: "center" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Список сменных заданий
+const JobList = ({ jobs = [], selectedJob, filter, setFilter, onClick } = {}) => {
+ //Генерация содержимого
+ return (
+
+ {
+ setFilter(pv => ({ ...pv, jobName: event.target.value }));
+ }}
+ >
+
+ {jobs.map(p => (
+ (onClick ? onClick(p) : null)}>
+ {p.SDOC_INFO}} />
+
+ ))}
+
+
+ );
+};
+
+//Контроль свойств - Список каталогов планов
+JobList.propTypes = {
+ jobs: PropTypes.array,
+ selectedJob: PropTypes.object,
+ onClick: PropTypes.func,
+ filter: PropTypes.object,
+ setFilter: PropTypes.func
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Корневая панель выдачи сменного задания
+const MechRecCostJobs = () => {
+ //Собственное состояние - таблица данных
+ const [state, setState] = useState({
+ init: false,
+ showJobList: false,
+ jobList: [],
+ jobListLoaded: false,
+ selectedJob: {},
+ processIdent: null,
+ dataLoaded: false
+ });
+
+ //Состояние для фильтра каталогов
+ const [filter, setFilter] = useState({ jobName: "" });
+
+ //Массив отфильтрованных каталогов
+ const filteredJobs = useFilteredFcjobs(state.jobList, filter);
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Подключение к контексту сообщений
+ const { InlineMsgInfo } = useContext(MessagingСtx);
+
+ //Инициализация каталогов планов
+ const initPlans = useCallback(async () => {
+ if (!state.init) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBS_INIT",
+ args: {},
+ respArg: "COUT",
+ fullResponse: true,
+ isArray: name => name === "XFCJOBS"
+ });
+ setState(pv => ({
+ ...pv,
+ init: true,
+ jobList: [...(data.XPAYLOAD?.XFCJOBS || [])],
+ jobListLoaded: true,
+ processIdent: data.XPAYLOAD.XINFO.NPROCESS_IDENT
+ }));
+ }
+ }, [state.init, executeStored]);
+
+ //При подключении компонента к странице
+ useEffect(() => {
+ initPlans();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ //Очистка селектлиста по идентификатору процесса
+ const clearSelectlist = useCallback(
+ async NIDENT => {
+ try {
+ await executeStored({
+ stored: "P_SELECTLIST_CLEAR",
+ args: { NIDENT: NIDENT }
+ });
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ },
+ [executeStored]
+ );
+
+ //Выбор плана
+ const selectJob = job => {
+ //Очищаем селектлист
+ clearSelectlist(state.processIdent);
+ //Обновляем состояние
+ setState(pv => ({
+ ...pv,
+ selectedJob: job,
+ showJobList: false,
+ dataLoaded: false
+ }));
+ };
+
+ //Сброс выбора плана
+ const unselectJob = () => {
+ //Очищаем селектлист
+ clearSelectlist(state.processIdent);
+ //Обновляем состояние
+ setState(pv => ({
+ ...pv,
+ selectedJob: {},
+ showJobList: false,
+ dataLoaded: false
+ }));
+ };
+
+ //Обработка нажатия на элемент в списке планов
+ const handleJobClick = job => {
+ if (state.selectedJob.NRN != job.NRN) selectJob(job);
+ else unselectJob();
+ };
+
+ //Генерация содержимого
+ return (
+
+ setState(pv => ({ ...pv, showJobList: !pv.showJobList }))}>
+ Сменные задания
+
+ setState(pv => ({ ...pv, showJobList: false }))} sx={STYLES.JOBS_DRAWER}>
+
+
+
+ {state.selectedJob.NRN ? (
+ <>
+ {`Сменное задание "${state.selectedJob.SSUBDIV}" на ${state.selectedJob.SPERIOD}`}
+
+ >
+ ) : !state.selectedJob.NRN ? (
+
+ ) : null}
+
+
+ );
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { MechRecCostJobs };
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 4f55813..455f5ea 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
@@ -257,7 +257,7 @@ const MechRecCostProdPlans = () => {
const initPlanCtlgs = useCallback(async () => {
if (!state.init) {
const data = await executeStored({
- stored: "PKG_P8PANELS_MECHREC.ACATALOG_INIT",
+ stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_PP_CTLG_INIT",
args: {},
respArg: "COUT",
isArray: name => name === "XFCPRODPLAN_CRNS"
diff --git a/app/panels/mech_rec_dept_cost_jobs/index.js b/app/panels/mech_rec_dept_cost_jobs/index.js
new file mode 100644
index 0000000..ec84fd1
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_jobs/index.js
@@ -0,0 +1,16 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Загрузка цеха
+ Панель мониторинга: Точка входа
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { MechRecDeptCostJobs } from "./mech_rec_dept_cost_jobs"; //Корневая панель загрузки цеха
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export const RootClass = MechRecDeptCostJobs;
diff --git a/app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js b/app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js
new file mode 100644
index 0000000..c33c5e1
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js
@@ -0,0 +1,154 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Загрузка цеха
+ Панель мониторинга: Корневая панель загрузки цеха
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React
+import { Typography, Box, Grid } from "@mui/material"; //Интерфейсные элементы
+import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
+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"; //Контекст взаимодействия с сервером
+
+//---------
+//Константы
+//---------
+
+//Размер страницы данных
+const DATA_GRID_PAGE_SIZE = 5;
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center", paddingTop: "20px" },
+ TITLE: { paddingBottom: "15px" },
+ DATA_GRID_CONTAINER: { minWidth: "95vw", maxWidth: "95vw", minHeight: "80vh", maxHeight: "80vh" },
+ DATA_GRID_CELL: (row, columnDef) => ({
+ padding: "8px",
+ textOverflow: "ellipsis",
+ overflow: "hidden",
+ whiteSpace: "pre",
+ ...(columnDef.name.match(/N.*_VALUE/) && row[columnDef.name]
+ ? { backgroundColor: row[`${columnDef.name.substring(0, 12)}_TYPE`] === 0 ? "lightgrey" : "lightgreen" }
+ : {})
+ })
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Генерация заливки строки исходя от значений
+const dataCellRender = ({ row, columnDef }) => ({
+ cellProps: { title: row[columnDef.name] },
+ cellStyle: STYLES.DATA_GRID_CELL(row, columnDef),
+ data: row[columnDef]
+});
+
+//-----------
+//Тело модуля
+//-----------
+
+//Корневая панель загрузки цеха
+const MechRecDeptCostJobs = () => {
+ //Собственное состояние - таблица данных
+ const [costJobs, setCostJobs] = useState({
+ subdiv: null,
+ dataLoaded: false,
+ columnsDef: [],
+ filters: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true,
+ fixedHeader: false,
+ fixedColumns: 0
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costJobs.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCJOBS_DEP_LOAD_DG_GET",
+ args: {
+ CFILTERS: { VALUE: object2Base64XML(costJobs.filters, { arrayNodeName: "filters" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ CORDERS: { VALUE: object2Base64XML(costJobs.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costJobs.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costJobs.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT"
+ });
+ setCostJobs(pv => ({
+ ...pv,
+ fixedHeader: data.XFCJOBS.XDATA.XDATA_GRID.fixedHeader,
+ fixedColumns: data.XFCJOBS.XDATA.XDATA_GRID.fixedColumns,
+ subdiv: data.XINFO.SSUBDIV,
+ columnsDef: data.XFCJOBS.XDATA.XCOLUMNS_DEF ? [...data.XFCJOBS.XDATA.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XFCJOBS.XDATA.XROWS || [])] : [...pv.rows, ...(data.XFCJOBS.XDATA.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XFCJOBS.XDATA.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ }, [costJobs.reload, costJobs.filters, costJobs.orders, costJobs.dataLoaded, costJobs.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);
+
+ //При изменении состояния фильтра
+ const handleFilterChanged = ({ filters }) => setCostJobs(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reload: true }));
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setCostJobs(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setCostJobs(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costJobs.reload, loadData]);
+
+ //Генерация содержимого
+ return (
+
+
+ {costJobs.dataLoaded ? `Загрузка станков "${costJobs.subdiv}"` : null}
+
+
+
+
+ {costJobs.dataLoaded ? (
+ dataCellRender({ ...prms })}
+ />
+ ) : null}
+
+
+
+
+ );
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { MechRecDeptCostJobs };
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js
new file mode 100644
index 0000000..b78e113
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js
@@ -0,0 +1,260 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
+ Компонент панели: Таблица маршрутных листов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField, IconButton, Icon } 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 { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
+import { CostRouteListsSpecsDataGrid } from "./fcroutlstsp"; //Состояние таблицы заказов маршрутных листов
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center" },
+ TABLE: { paddingTop: "15px" },
+ TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" },
+ DIALOG_BUTTONS: { marginTop: "10px", width: "240px" }
+};
+
+//---------------------------------------------
+//Вспомогательные функции форматирования данных
+//---------------------------------------------
+
+//Генерация представления расширения строки
+export const rowExpandRender = ({ row }) => {
+ return (
+
+
+
+ );
+};
+
+//Форматирование значений колонок
+const dataCellRender = ({ row, columnDef, handlePriorEditOpen }) => {
+ //!!! Пока отключено - не удалять
+ switch (columnDef.name) {
+ case "NPRIOR_PARTY":
+ return {
+ data: (
+ <>
+ {row["NPRIOR_PARTY"]}
+
handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}>
+ edit
+
+ >
+ )
+ };
+ }
+ return {
+ data: row[columnDef]
+ };
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица маршрутных листов
+const CostRouteListsDataGrid = ({ task }) => {
+ //Собственное состояние - таблица данных
+ const [costRouteLists, setCostRouteLists] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true,
+ editPriorNRN: null,
+ editPriorValue: null
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Размер страницы данных
+ const DATA_GRID_PAGE_SIZE = 5;
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costRouteLists.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCROUTLST_DEPT_DG_GET",
+ args: {
+ NFCPRODPLANSP: task,
+ CORDERS: { VALUE: object2Base64XML(costRouteLists.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costRouteLists.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT"
+ });
+ setCostRouteLists(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costRouteLists.reload,
+ costRouteLists.filters,
+ costRouteLists.orders,
+ costRouteLists.dataLoaded,
+ costRouteLists.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costRouteLists.reload, loadData]);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setCostRouteLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setCostRouteLists(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //При открытии изменения приоритета партии
+ const handlePriorEditOpen = (NRN, nPriorValue) => {
+ setCostRouteLists(pv => ({ ...pv, editPriorNRN: NRN, editPriorValue: nPriorValue }));
+ };
+
+ //При закрытии изменения приоритета партии
+ const handlePriorEditClose = () => {
+ setCostRouteLists(pv => ({ ...pv, editPriorNRN: null, editPriorValue: null }));
+ };
+
+ //При изменении значения приоритета партии
+ const handlePriorFormChanged = e => {
+ setCostRouteLists(pv => ({ ...pv, editPriorValue: e.target.value }));
+ };
+
+ //Изменение приоритета
+ const priorChange = useCallback(
+ async (NRN, PriorValue, rows) => {
+ try {
+ await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCROUTLST_PRIOR_PARTY_UPDATE",
+ args: { NFCROUTLST: NRN, SPRIOR_PARTY: PriorValue }
+ });
+ //Изменяем значение приоритета у нужного
+ rows[rows.findIndex(obj => obj.NRN == NRN)].NPRIOR_PARTY = PriorValue;
+ //Актуализируем строки таблицы
+ setCostRouteLists(pv => ({ ...pv, rows: rows }));
+ //Закрываем окно
+ handlePriorEditClose();
+ } catch (e) {
+ throw new Error(e.message);
+ }
+ },
+ [executeStored]
+ );
+
+ //При нажатии на изменение приоритета партии
+ const handlePriorChange = () => {
+ //Изменяем значение
+ priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue, costRouteLists.rows);
+ };
+
+ //Генерация содержимого
+ return (
+
+
В производстве
+ {costRouteLists.dataLoaded ? (
+ <>
+
+ dataCellRender({ ...prms, handlePriorEditOpen })}
+ />
+
+ >
+ ) : null}
+ {costRouteLists.editPriorNRN ? (
+
handlePriorEditClose(null)}>
+
+
+
+
+
+ Изменить
+
+
+
+
+
+ handlePriorEditClose(null)}>Закрыть
+
+
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Таблица маршрутных листов
+CostRouteListsDataGrid.propTypes = {
+ task: PropTypes.number.isRequired
+};
+
+//Диалог с таблицей сдачи продукции
+const CostRouteListsDataGridDialog = ({ task, onClose }) => {
+ return (
+
+
+
+
+ {onClose ? (
+
+ Закрыть
+
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Диалог с таблицей маршрутных листов
+CostRouteListsDataGridDialog.propTypes = {
+ task: PropTypes.number.isRequired,
+ onClose: PropTypes.func
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CostRouteListsDataGridDialog };
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js
new file mode 100644
index 0000000..0161b88
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js
@@ -0,0 +1,124 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
+ Компонент панели: Таблица строк маршрутного листа
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography } 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 { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { margin: "5px 0px", textAlign: "center" }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица строк маршрутного листа
+const CostRouteListsSpecsDataGrid = ({ mainRowRN }) => {
+ //Собственное состояние - таблица данных
+ const [costRouteListsSpecs, setCostRouteListsSpecs] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Размер страницы данных
+ const DATA_GRID_PAGE_SIZE = 10;
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costRouteListsSpecs.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCROUTLSTSP_DEPT_DG_GET",
+ args: {
+ NFCROUTLST: mainRowRN,
+ CORDERS: { VALUE: object2Base64XML(costRouteListsSpecs.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costRouteListsSpecs.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costRouteListsSpecs.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT"
+ });
+ setCostRouteListsSpecs(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costRouteListsSpecs.reload,
+ costRouteListsSpecs.filters,
+ costRouteListsSpecs.orders,
+ costRouteListsSpecs.dataLoaded,
+ costRouteListsSpecs.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costRouteListsSpecs.reload, loadData]);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setCostRouteListsSpecs(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setCostRouteListsSpecs(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //Генерация содержимого
+ return (
+
+
Операции
+ {costRouteListsSpecs.dataLoaded ? (
+
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Таблица строк маршрутного листа
+CostRouteListsSpecsDataGrid.propTypes = {
+ mainRowRN: PropTypes.number.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CostRouteListsSpecsDataGrid };
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/hooks.js b/app/panels/mech_rec_dept_cost_prod_plans/hooks.js
new file mode 100644
index 0000000..0cef903
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_prod_plans/hooks.js
@@ -0,0 +1,23 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
+ Кастомные хуки
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+
+//-----------
+//Тело модуля
+//-----------
+
+//Клиентский отбор каталогов по поисковой фразе и наличию планов
+export const useFilteredPlans = (plans, filter) => {
+ const filteredPlans = React.useMemo(() => {
+ return plans.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.planName));
+ }, [plans, filter]);
+
+ return filteredPlans;
+};
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js b/app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js
new file mode 100644
index 0000000..67f9abf
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js
@@ -0,0 +1,142 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
+ Компонент панели: Таблица сдачи продукции
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box, Dialog, DialogContent, DialogActions, Button } 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 { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center" },
+ TABLE: { paddingTop: "15px" }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица сдачи продукции
+const IncomFromDepsDataGrid = ({ task }) => {
+ //Собственное состояние - таблица данных
+ const [incomFromDeps, setIncomFromDeps] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Размер страницы данных
+ const DATA_GRID_PAGE_SIZE = 10;
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (incomFromDeps.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DEPT_DG_GET",
+ args: {
+ NFCPRODPLANSP: task,
+ CORDERS: { VALUE: object2Base64XML(incomFromDeps.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: incomFromDeps.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1
+ },
+ attributeValueProcessor: (name, val) => (["DDUE_DATE"].includes(name) ? formatDateRF(val) : val),
+ respArg: "COUT"
+ });
+ setIncomFromDeps(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [incomFromDeps.reload, incomFromDeps.orders, incomFromDeps.dataLoaded, incomFromDeps.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [incomFromDeps.reload, loadData]);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setIncomFromDeps(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setIncomFromDeps(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //Генерация содержимого
+ return (
+
+
Сдача продукции
+
+ {incomFromDeps.dataLoaded ? (
+
+ ) : null}
+
+
+ );
+};
+
+//Контроль свойств - Таблица сдачи продукции
+IncomFromDepsDataGrid.propTypes = {
+ task: PropTypes.number.isRequired
+};
+
+//Диалог с таблицей сдачи продукции
+const IncomFromDepsDataGridDialog = ({ task, onClose }) => {
+ return (
+
+
+
+
+ {onClose ? (
+
+ Закрыть
+
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Диалог с таблицей сдачи продукции
+IncomFromDepsDataGridDialog.propTypes = {
+ task: PropTypes.number.isRequired,
+ onClose: PropTypes.func
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { IncomFromDepsDataGridDialog };
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/index.js b/app/panels/mech_rec_dept_cost_prod_plans/index.js
new file mode 100644
index 0000000..21d3907
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_prod_plans/index.js
@@ -0,0 +1,16 @@
+/*
+ Парус 8 - Панели мониторинга - ПУДП - Производственный план цеха
+ Панель мониторинга: Точка входа
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { MechRecDeptCostProdPlans } from "./mech_rec_dept_cost_prod_plans"; //Корневая панель производственного плана цеха
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export const RootClass = MechRecDeptCostProdPlans;
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js
new file mode 100644
index 0000000..0e4a5b5
--- /dev/null
+++ b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js
@@ -0,0 +1,399 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
+ Панель мониторинга: Корневая панель производственного плана цеха
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField, Link, Grid } from "@mui/material"; //Интерфейсные элементы
+import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки
+import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
+import { IncomFromDepsDataGridDialog } from "./incomefromdeps"; //Диалог сдачи продукции
+import { CostRouteListsDataGridDialog } from "./fcroutlst"; //Диалог маршрутных листов
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" },
+ PLANS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" },
+ PLANS_BUTTON: { position: "absolute", marginTop: "10px", marginLeft: "10px" },
+ PLANS_DRAWER: {
+ width: "350px",
+ display: "inline-block",
+ flexShrink: 0,
+ [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
+ },
+ CONTAINER: { paddingTop: "40px", margin: "5px 0px", textAlign: "center" },
+ DATA_GRID_CONTAINER: { minWidth: "95vw", maxWidth: "95vw", minHeight: "80vh", maxHeight: "80vh" },
+ DATA_GRID_GROUP_CELL: { padding: "2px" },
+ DATA_GRID_CELL: { padding: "8px", maxWidth: "300px", textOverflow: "ellipsis", overflow: "hidden", whiteSpace: "pre" },
+ DATA_GRID_CELL_STATUS: (currentStyle, row) => ({ backgroundColor: getRowBackgroudColor(row), ...currentStyle }),
+ DATA_GRID_CELL_PLAN_FACT: currentStyle => ({ ...currentStyle, backgroundColor: "lightgrey" }),
+ DATA_GRID_CELL_MATRES_CODE: (currentStyle, row) => ({ backgroundColor: getRowBackgroudColor(row), ...currentStyle }),
+ PLAN_FACT_VALUE: { textAlign: "center", display: "flex", justifyContent: "center" },
+ PLAN_FACT_DELIMITER: { padding: "0px 5px" },
+ FACT_VALUE: { color: "blue" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Генерация представления ячейки заголовка группы
+export const groupCellRender = ({ group }) => ({
+ cellStyle: STYLES.DATA_GRID_GROUP_CELL,
+ data: group.caption
+});
+
+//Вычисление цвета заливки для строки
+const getRowBackgroudColor = row => {
+ //Факт === План
+ if (row["NMAIN_QUANT"] === row["NREL_FACT"]) return "lightgreen";
+ //План <= (Факт + Запущено)
+ if (row["NMAIN_QUANT"] <= row["NREL_FACT"] + row["NFCROUTLST_QUANT"]) return "lightblue";
+ //Сумма "Количество план" = 0 или < "План"
+ if (row["NSUM_PLAN"] === 0 || (row["NSUM_PLAN"] !== 0 && row["NSUM_PLAN"] < row["NMAIN_QUANT"])) {
+ //"Факт" >= "План"
+ if (row["NREL_FACT"] >= row["NMAIN_QUANT"]) return "#F0E68C";
+ } else {
+ //Сумма "Количество факт" >= сумма "Количество план"
+ if (row["NSUM_FACT"] >= row["NSUM_PLAN"]) return "#F0E68C";
+ }
+ return "lightcoral";
+};
+
+//Генерация заливки строки исходя от значений
+const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCodeClick }) => {
+ //Описываем общие свойства
+ let cellProps = { title: row[columnDef.name] };
+ //Описываем общий стиль
+ let cellStyle = STYLES.DATA_GRID_CELL;
+ //Для колонки "Статус"
+ if (columnDef.name === "SSTATUS") return { cellProps, cellStyle: STYLES.DATA_GRID_CELL_STATUS(cellStyle, row), data: row[columnDef] };
+ //Для колонки даты
+ if (columnDef.name.indexOf("PLAN_FACT") >= 0) {
+ //Получаем текущий день
+ let curDay = new Date().getDate().toString().padStart(2, "0");
+ //Формируем regex для проверки
+ let regex = new RegExp(`N_${curDay}.*`, "g");
+ //Если это значение текущего дня
+ if (columnDef.name.match(regex)) cellStyle = STYLES.DATA_GRID_CELL_PLAN_FACT(cellStyle);
+ //Если в колонке есть значение
+ if (row[columnDef.name]) {
+ //Разбиваем его на план/факт
+ let values = row[columnDef.name].split("/");
+ //Разбиваем значения на блоки
+ return {
+ cellProps,
+ cellStyle,
+ data: (
+
+ {values[0]}
+ /
+ {values[1]}
+
+ )
+ };
+ } else return { cellProps, cellStyle, data: row[columnDef] };
+ }
+ //Для колонки "Заказ"
+ if (columnDef.name === "SPROD_ORDER") {
+ return {
+ cellProps,
+ cellStyle,
+ data: (
+
handleProdOrderClick(row["NRN"])}>
+ {row[columnDef.name]}
+
+ )
+ };
+ }
+ //Для колонки "Обозначение"
+ if (columnDef.name === "SMATRES_CODE")
+ return {
+ cellProps,
+ cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),
+ data: (
+
handleMatresCodeClick(row["NRN"])}>
+ {row[columnDef.name]}
+
+ )
+ };
+ //Для всех остальных
+ return { cellProps, cellStyle, data: row[columnDef] };
+};
+
+//Список каталогов планов
+const PlanList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => {
+ //Генерация содержимого
+ return (
+
+ {
+ setFilter(pv => ({ ...pv, planName: event.target.value }));
+ }}
+ >
+
+ {plans.map(p => (
+ (onClick ? onClick(p) : null)}>
+ {p.SDOC_INFO}} />
+
+ ))}
+
+
+ );
+};
+
+//Контроль свойств - Список каталогов планов
+PlanList.propTypes = {
+ plans: PropTypes.array,
+ selectedPlan: PropTypes.object,
+ onClick: PropTypes.func,
+ filter: PropTypes.object,
+ setFilter: PropTypes.func
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Корневая панель производственного плана цеха
+const MechRecDeptCostProdPlans = () => {
+ //Собственное состояние - таблица данных
+ const [state, setState] = useState({
+ init: false,
+ showPlanList: false,
+ showIncomeFromDeps: null,
+ showFcroutelst: null,
+ planList: [],
+ planListLoaded: false,
+ selectedPlan: {},
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true,
+ fixedHeader: false,
+ fixedColumns: 0
+ });
+
+ //Состояние для фильтра каталогов
+ const [filter, setFilter] = useState({ planName: "" });
+
+ //Массив отфильтрованных каталогов
+ const filteredPlanCtgls = useFilteredPlans(state.planList, filter);
+
+ //Размер страницы данных
+ const DATA_GRID_PAGE_SIZE = 10;
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Подключение к контексту сообщений
+ const { InlineMsgInfo } = useContext(MessagingСtx);
+
+ // Инициализация каталогов планов
+ const initPlans = useCallback(async () => {
+ if (!state.init) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT",
+ args: {},
+ respArg: "COUT",
+ isArray: name => name === "XFCPRODPLANS",
+ attributeValueProcessor: (name, val) => (name === "SPERIOD" ? undefined : val)
+ });
+ setState(pv => ({ ...pv, init: true, planList: [...(data?.XFCPRODPLANS || [])], planListLoaded: true }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [state.init, executeStored]);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(
+ async NRN => {
+ if (state.reload && NRN) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_DEPT_DG_GET",
+ args: {
+ NFCPRODPLAN: NRN,
+ CORDERS: { VALUE: object2Base64XML(state.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: state.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: state.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT",
+ attributeValueProcessor: (name, val) => (name === "caption" ? undefined : val)
+ });
+ setState(pv => ({
+ ...pv,
+ fixedHeader: data.XDATA_GRID.fixedHeader,
+ fixedColumns: data.XDATA_GRID.fixedColumns,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [state.reload, state.orders, state.dataLoaded, state.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]
+ );
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ if (state.selectedPlan.NRN) {
+ loadData(state.selectedPlan.NRN);
+ } else {
+ setState(pv => ({ ...pv, dataLoaded: false, columnsDef: [], orders: null, rows: [], reload: true, pageNumber: 1, morePages: true }));
+ }
+ }, [state.selectedPlan, state.reload, loadData]);
+
+ //При подключении компонента к странице
+ useEffect(() => {
+ initPlans();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ //Выбор плана
+ const selectPlan = plan => {
+ setState(pv => ({
+ ...pv,
+ showIncomeFromDeps: null,
+ showFcroutelst: null,
+ selectedPlan: plan,
+ showPlanList: false,
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ }));
+ };
+
+ //Сброс выбора плана
+ const unselectPlan = () =>
+ setState(pv => ({
+ ...pv,
+ showIncomeFromDeps: null,
+ showFcroutelst: null,
+ selectedPlan: {},
+ showPlanList: false,
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ }));
+
+ //Обработка нажатия на элемент в списке планов
+ const handlePlanClick = plan => {
+ if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan);
+ else unselectPlan();
+ };
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setState(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setState(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //При нажатии на "Заказ"
+ const handleProdOrderClick = planSp => {
+ setState(pv => ({ ...pv, showIncomeFromDeps: planSp }));
+ };
+
+ //При нажатии на "Обозначение"
+ const handleMatresCodeClick = planSp => {
+ setState(pv => ({ ...pv, showFcroutelst: planSp }));
+ };
+
+ //Генерация содержимого
+ return (
+ <>
+
setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
+ Планы
+
+
setState(pv => ({ ...pv, showPlanList: false }))}
+ sx={STYLES.PLANS_DRAWER}
+ >
+
+
+
+ {state.dataLoaded ? (
+
+ {`Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`}
+
+ ) : null}
+
+
+
+ {state.dataLoaded ? (
+ dataCellRender({ ...prms, handleProdOrderClick, handleMatresCodeClick })}
+ groupCellRender={groupCellRender}
+ />
+ ) : !state.selectedPlan.NRN ? (
+
+ ) : null}
+
+
+
+ {state.showIncomeFromDeps ? (
+
handleProdOrderClick(null)} />
+ ) : null}
+ {state.showFcroutelst ? (
+ handleMatresCodeClick(null)} />
+ ) : null}
+
+ >
+ );
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { MechRecDeptCostProdPlans };
diff --git a/app/panels/prj_fin/projects.js b/app/panels/prj_fin/projects.js
index ba4c6fb..9855e07 100644
--- a/app/panels/prj_fin/projects.js
+++ b/app/panels/prj_fin/projects.js
@@ -144,12 +144,12 @@ const Projects = () => {
};
//Отображение детализации точки графика затрат
- const showCostNotesChartDetail = async ({ unitCode, year, month }) => {
+ const showCostNotesChartDetail = async ({ year, month }) => {
const data = await executeStored({
stored: "PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST",
args: { NYEAR: year, NMONTH: month }
});
- if (data.NIDENT) pOnlineShowUnit({ unitCode, inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
+ if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
@@ -178,7 +178,7 @@ const Projects = () => {
pageNumber: 1,
reload: true
}));
- if (item.SUNITCODE && item.NYEAR && item.NMONTH) showCostNotesChartDetail({ unitCode: item.SUNITCODE, year: item.NYEAR, month: item.NMONTH });
+ if (item.SUNITCODE == "CostNotes" && item.NYEAR && item.NMONTH) showCostNotesChartDetail({ year: item.NYEAR, month: item.NMONTH });
};
//При необходимости обновить данные
diff --git a/app/panels/prj_fin/stage_arts.js b/app/panels/prj_fin/stage_arts.js
index 37103c3..ca9d06b 100644
--- a/app/panels/prj_fin/stage_arts.js
+++ b/app/panels/prj_fin/stage_arts.js
@@ -71,7 +71,7 @@ const StageArts = ({ stage, filters }) => {
stored: "PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT",
args: { NSTAGE: stage, NFPDARTCL: sender.NRN }
});
- if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
+ if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
diff --git a/app/panels/prj_fin/stage_contracts.js b/app/panels/prj_fin/stage_contracts.js
index c3395e6..dddc3fb 100644
--- a/app/panels/prj_fin/stage_contracts.js
+++ b/app/panels/prj_fin/stage_contracts.js
@@ -92,7 +92,7 @@ const StageContracts = ({ stage, filters }) => {
stored: "PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN",
args: { NPROJECTSTAGEPF: sender.NRN }
});
- if (data.NIDENT) pOnlineShowUnit({ unitCode: "PaymentAccountsIn", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
+ if (data.NIDENT) pOnlineShowUnit({ unitCode: "PaymentAccountsIn", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
@@ -112,7 +112,7 @@ const StageContracts = ({ stage, filters }) => {
stored: "PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV",
args: { NPROJECTSTAGEPF: sender.NRN }
});
- if (data.NIDENT) pOnlineShowUnit({ unitCode: "IncomingInvoices", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
+ if (data.NIDENT) pOnlineShowUnit({ unitCode: "IncomingInvoices", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
diff --git a/app/panels/prj_fin/stages.js b/app/panels/prj_fin/stages.js
index 32b836e..9fec2da 100644
--- a/app/panels/prj_fin/stages.js
+++ b/app/panels/prj_fin/stages.js
@@ -106,7 +106,7 @@ const Stages = ({ project, projectName, filters }) => {
stored: "PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT",
args: { NRN: sender.NRN }
});
- if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
+ if (data.NIDENT) pOnlineShowUnit({ unitCode: "CostNotes", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
@@ -116,8 +116,7 @@ const Stages = ({ project, projectName, filters }) => {
stored: "PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ",
args: { NRN: sender.NRN }
});
- if (data.NIDENT)
- pOnlineShowUnit({ unitCode: "GoodsTransInvoicesToConsumers", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] });
+ if (data.NIDENT) pOnlineShowUnit({ unitCode: "GoodsTransInvoicesToConsumers", inputParameters: [{ name: "in_IDENT", value: data.NIDENT }] });
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
diff --git a/app/panels/prj_graph/layouts.js b/app/panels/prj_graph/layouts.js
index 0ccc943..11ef118 100644
--- a/app/panels/prj_graph/layouts.js
+++ b/app/panels/prj_graph/layouts.js
@@ -18,6 +18,23 @@ import { formatDateRF } from "../../core/utils"; //Вспомогательны
//Шаблон имени ячейки месяца
const MONTH_COLUMN_REG_EXP = /[0-9]{4}_[0-9]{1,2}/;
+//Стили
+const STYLES = {
+ GROUP_CELL: { padding: "2px" },
+ GROUP_CELL_LINK: { textOverflow: "ellipsis", overflow: "hidden", whiteSpace: "pre", minWidth: "800px", maxWidth: "800px" },
+ MONTH_CELL: { padding: "2px", maxWidth: "30px", overflow: "visible", fontSize: "smaller", whiteSpace: "nowrap" },
+ MONTH_CELL_FILLED: state => ({ backgroundColor: state == 0 ? "lightyellow" : state == 1 ? "lightgreen" : "lightblue", cursor: "pointer" }),
+ JOB_CELL: {
+ padding: "2px",
+ paddingLeft: "10px",
+ maxWidth: "300px",
+ textOverflow: "ellipsis",
+ overflow: "hidden",
+ whiteSpace: "pre",
+ fontSize: "smaller"
+ }
+};
+
//-----------
//Тело модуля
//-----------
@@ -46,9 +63,16 @@ const formatStageItemValue = (state, text) => {
//Генерация представления ячейки заголовка группы
export const groupCellRender = ({ group, pOnlineShowDocument }) => ({
- cellStyle: { padding: "2px" },
+ cellStyle: STYLES.GROUP_CELL,
data: (
-
pOnlineShowDocument({ unitCode: "Projects", document: group.name })}>
+
pOnlineShowDocument({ unitCode: "Projects", document: group.name })}
+ >
{group.caption}
)
@@ -67,14 +91,14 @@ export const dataCellRender = ({ row, columnDef, pOnlineShowDocument }) => {
let data = null;
if ((dF <= mF && dT >= mT) || (dF >= mF && dF <= mT) || (dT >= mF && dT <= mT)) {
if (year == dF.getFullYear() && month == dF.getMonth() + 1) data = formatStageItemValue(row.NSTATE, row.SRESP);
- cellStyle = { backgroundColor: row.NSTATE == 0 ? "lightyellow" : row.NSTATE == 1 ? "lightgreen" : "lightblue", cursor: "pointer" };
+ cellStyle = STYLES.MONTH_CELL_FILLED(row.NSTATE);
cellProps = {
title: `${formatDateRF(dF)} - ${formatDateRF(dT)}`,
onClick: () => pOnlineShowDocument({ unitCode: "ProjectsStages", document: row.NRN })
};
}
return {
- cellStyle: { padding: "2px", maxWidth: "30px", overflow: "visible", fontSize: "smaller", whiteSpace: "nowrap", ...cellStyle },
+ cellStyle: { ...STYLES.MONTH_CELL, ...cellStyle },
cellProps,
data
};
@@ -83,15 +107,7 @@ export const dataCellRender = ({ row, columnDef, pOnlineShowDocument }) => {
case "SJOB":
return {
cellProps: { title: row[columnDef.name] },
- cellStyle: {
- padding: "2px",
- paddingLeft: "10px",
- maxWidth: "300px",
- textOverflow: "ellipsis",
- overflow: "hidden",
- whiteSpace: "pre",
- fontSize: "smaller"
- }
+ cellStyle: STYLES.JOB_CELL
};
}
};
diff --git a/app/panels/prj_graph/prj_graph.js b/app/panels/prj_graph/prj_graph.js
index 7d9da52..1fc4f99 100644
--- a/app/panels/prj_graph/prj_graph.js
+++ b/app/panels/prj_graph/prj_graph.js
@@ -15,6 +15,15 @@ import { ApplicationСtx } from "../../context/application"; //Контекст
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { dataCellRender, groupCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ DATA_GRID_CONTAINER: { minWidth: "95vw", maxWidth: "95vw", minHeight: "87vh", maxHeight: "87vh" }
+};
+
//-----------
//Тело модуля
//-----------
@@ -27,7 +36,9 @@ const PrjGraph = () => {
columnsDef: [],
groups: [],
rows: [],
- reload: true
+ reload: true,
+ fixedHeader: false,
+ fixedColumns: 0
});
//Подключение к контексту приложения
@@ -42,6 +53,8 @@ const PrjGraph = () => {
const data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.GRAPH", args: {}, respArg: "COUT" });
setdataGrid(pv => ({
...pv,
+ fixedHeader: data.XDATA_GRID.fixedHeader,
+ fixedColumns: data.XDATA_GRID.fixedColumns,
columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
rows: [...(data.XROWS || [])],
groups: [...(data.XGROUPS || [])],
@@ -61,7 +74,7 @@ const PrjGraph = () => {
-
+
{dataGrid.dataLoaded ? (
{
rows={dataGrid.rows}
size={P8P_DATA_GRID_SIZE.LARGE}
reloading={dataGrid.reload}
+ fixedHeader={dataGrid.fixedHeader}
+ fixedColumns={dataGrid.fixedColumns}
dataCellRender={prms => dataCellRender({ ...prms, pOnlineShowDocument })}
groupCellRender={prms => groupCellRender({ ...prms, pOnlineShowDocument })}
- containerComponentProps={{ elevation: 6, sx: { overflowX: "visible" } }}
+ containerComponentProps={{
+ elevation: 3,
+ sx: STYLES.DATA_GRID_CONTAINER
+ }}
/>
) : null}
diff --git a/app/panels/prj_jobs/lab_fact_rpt_dtl.js b/app/panels/prj_jobs/lab_fact_rpt_dtl.js
index 7716c3c..f443384 100644
--- a/app/panels/prj_jobs/lab_fact_rpt_dtl.js
+++ b/app/panels/prj_jobs/lab_fact_rpt_dtl.js
@@ -45,7 +45,7 @@ const LabFactRptDtl = ({ periodId, title, onHide }) => {
const loadFactRptDtl = useCallback(async () => {
if (factRptDtl.reload) {
const data = await executeStored({
- stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_FACT_RPT",
+ stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_FACT_RPT_LIST",
args: {
NJB_PERIODS: periodId,
CORDERS: { VALUE: object2Base64XML(factRptDtl.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
diff --git a/app/panels/prj_jobs/lab_plan_fot_dtl.js b/app/panels/prj_jobs/lab_plan_fot_dtl.js
index 37027eb..520360b 100644
--- a/app/panels/prj_jobs/lab_plan_fot_dtl.js
+++ b/app/panels/prj_jobs/lab_plan_fot_dtl.js
@@ -44,7 +44,7 @@ const LabPlanFOTDtl = ({ periodId, title, onHide }) => {
const loadPlanFOTDtl = useCallback(async () => {
if (planFOTDtl.reload) {
const data = await executeStored({
- stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_FOT",
+ stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_FOT_LIST",
args: {
NJB_PERIODS: periodId,
CORDERS: { VALUE: object2Base64XML(planFOTDtl.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
diff --git a/app/panels/prj_jobs/lab_plan_jobs_dtl.js b/app/panels/prj_jobs/lab_plan_jobs_dtl.js
index 1c77aa7..251dd68 100644
--- a/app/panels/prj_jobs/lab_plan_jobs_dtl.js
+++ b/app/panels/prj_jobs/lab_plan_jobs_dtl.js
@@ -49,7 +49,7 @@ const LabPlanJobsDtl = ({ periodId, title, onHide, onProjectClick }) => {
const loadPlanJobsDtl = useCallback(async () => {
if (planJobsDtl.reload) {
const data = await executeStored({
- stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS",
+ stored: "PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_JOBS_LIST",
args: {
NJB_PERIODS: periodId,
CORDERS: { VALUE: object2Base64XML(planJobsDtl.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js
index 696d436..307e578 100644
--- a/app/panels/prj_jobs/prj_jobs.js
+++ b/app/panels/prj_jobs/prj_jobs.js
@@ -9,13 +9,34 @@
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
-import { Drawer, Fab, Box, Grid, List, ListItemButton, ListItemText, ListItemIcon, Icon, Typography } from "@mui/material"; //Интерфейсные элементы
+import {
+ Drawer,
+ Fab,
+ Box,
+ Grid,
+ List,
+ ListItemButton,
+ ListItemText,
+ ListItemIcon,
+ Icon,
+ Typography,
+ Divider,
+ ListItem,
+ Button,
+ Dialog,
+ DialogContent,
+ DialogActions,
+ TextField,
+ DialogTitle
+} from "@mui/material"; //Интерфейсные элементы
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
+import { formatDateRF } from "../../core/utils"; //Вспомогательные функции
+import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы
import { ResMon } from "./res_mon"; //Монитор ресурсов
import { taskAttributeRenderer } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
@@ -31,7 +52,6 @@ const GANTT_WIDTH = "98vw";
//Стили
const STYLES = {
- PROJECTS_LIST_SAVE_BUTTON: { backgroundColor: "orange" },
PROJECTS_LIST_ITEM_NOJOBS: { backgroundColor: "#ff000045" },
PROJECTS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" },
PROJECTS_LIST_ITEM_SECONDARY: { wordWrap: "break-word", fontSize: "0.5rem", textTransform: "uppercase" },
@@ -50,6 +70,122 @@ const STYLES = {
//Вспомогательные функции и компоненты
//------------------------------------
+//Диалог параметров инициализации панели
+const InitPrmsDialog = ({ dateBegin, dateFact, onOk, onCancel }) => {
+ //Собственное состояние - значения с-по
+ const [values, setValues] = useState({ dateBegin: formatDateJSONDateOnly(dateBegin), dateFact: formatDateJSONDateOnly(dateFact) });
+
+ //Отработка воода значения в фильтр
+ const handleValueTextFieldChanged = e => setValues(prev => ({ ...prev, [e.target.name]: e.target.value }));
+
+ //Генерация содержимого
+ return (
+ (onCancel ? onCancel() : null)}
+ >
+ Параметры инициализации
+
+
+
+
+
+ (onOk ? onOk({ dateBegin: new Date(values.dateBegin), dateFact: new Date(values.dateFact) }) : null)}>
+ {BUTTONS.OK}
+
+ (onCancel ? onCancel() : null)}>{BUTTONS.CANCEL}
+
+
+ );
+};
+
+//Контроль свойств - Диалог параметров инициализации панели
+InitPrmsDialog.propTypes = {
+ dateBegin: PropTypes.instanceOf(Date).isRequired,
+ dateFact: PropTypes.instanceOf(Date).isRequired,
+ onOk: PropTypes.func,
+ onCancel: PropTypes.func
+};
+
+//Область параметров инициализации панели
+const InitPrmsArea = ({ dateBegin, dateFact, durationMeasCode, labMeasCode, onClick }) => {
+ return (
+
+
+
+ Начало:
+ {formatDateRF(dateBegin)}
+
+ Факт на:
+ {formatDateRF(dateFact)}
+
+ Длительность:
+ {durationMeasCode}
+
+ Трудоёмкость:
+ {labMeasCode}
+ >
+ }
+ />
+
+
+ refresh} onClick={onClick ? onClick : null}>
+ Переформировать...
+
+
+
+ );
+};
+
+//Контроль свойств - Область параметров инициализации панели
+InitPrmsArea.propTypes = {
+ dateBegin: PropTypes.instanceOf(Date),
+ dateFact: PropTypes.instanceOf(Date),
+ durationMeasCode: PropTypes.string,
+ labMeasCode: PropTypes.string,
+ onClick: PropTypes.func
+};
+
+//Область сохранения изменений
+const SaveChangesArea = ({ onClick }) => {
+ return (
+
+
+ save} onClick={onClick}>
+ Сохранить
+
+
+
+ );
+};
+
+//Контроль свойств - Область сохранения изменений
+SaveChangesArea.propTypes = {
+ onClick: PropTypes.func
+};
+
//Список проектов
const ProjectsList = ({ projects = [], selectedProject, onClick } = {}) => {
//Подключение к контексту сообщений
@@ -123,7 +259,9 @@ const PrjJobs = () => {
dateBegin: null,
dateFact: null,
durationMeas: null,
+ durationMeasCode: null,
labMeas: null,
+ labMeasCode: null,
resourceStatus: null,
ident: null,
projects: [],
@@ -132,7 +270,8 @@ const PrjJobs = () => {
selectedProject: null,
selectedProjectDocRn: null,
selectedProjectGanttDef: {},
- selectedProjectTasks: []
+ selectedProjectTasks: [],
+ showInitDialog: false
});
//Подключение к контексту приложения
@@ -182,12 +321,12 @@ const PrjJobs = () => {
//Изменение работы в графике
const modifyJob = useCallback(
- async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {
+ async (job, dateFrom, dateTo) => {
let data = null;
try {
data = await executeStored({
stored: "PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD",
- args: { NJB_JOBS: job, DDATE_FROM: dateFrom, DDATE_TO: dateTo, DBEGIN: dateBegin, DFACT: dateFact, NDURATION_MEAS: durationMeas }
+ args: { NJB_JOBS: job, DDATE_FROM: dateFrom, DDATE_TO: dateTo }
});
if (data?.NRESOURCE_STATUS != -1) {
setState(pv => ({ ...pv, resourceStatus: data.NRESOURCE_STATUS, needSave: true }));
@@ -216,25 +355,26 @@ const PrjJobs = () => {
const data = await executeStored({
stored: "PKG_P8PANELS_PROJECTS.JB_INIT",
args: {
- DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,
- DFACT: state.dateFact ? new Date(state.dateFact) : null,
- NDURATION_MEAS: state.durationMeas,
- SLAB_MEAS: state.labMeas,
+ DBEGIN: state.dateBegin ? state.dateBegin : null,
+ DFACT: state.dateFact ? state.dateFact : null,
NIDENT: state.ident
}
});
setState(pv => ({
...pv,
init: true,
- dateBegin: data.DBEGIN,
- dateFact: data.DFACT,
+ reInit: false,
+ dateBegin: new Date(data.DBEGIN),
+ dateFact: new Date(data.DFACT),
durationMeas: data.NDURATION_MEAS,
- labMeas: data.SLAB_MEAS,
+ durationMeasCode: data.SDURATION_MEAS,
+ labMeas: data.NLAB_MEAS,
+ labMeasCode: data.SLAB_MEAS,
resourceStatus: data.NRESOURCE_STATUS,
ident: data.NIDENT
}));
}
- }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);
+ }, [state.init, state.dateBegin, state.dateFact, state.ident, executeStored]);
//Грузим список проектов при смене идентификатора процесса
useEffect(() => {
@@ -246,11 +386,10 @@ const PrjJobs = () => {
if (state.selectedProject) loadProjectJobs(false);
}, [state.selectedProject, loadProjectJobs]);
- //При подключении компонента к странице
+ //При изменении флага инициализации
useEffect(() => {
initJobs();
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
+ }, [state.init, initJobs]);
//Выбор проекта
const selectPoject = (project, projectDocRn) => {
@@ -289,9 +428,19 @@ const PrjJobs = () => {
//Обработка измненения сроков задачи в диаграмме Гантта
const handleTaskDatesChange = ({ task, start, end, isMain }) => {
- if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);
+ if (isMain) modifyJob(task.rn, new Date(start), new Date(end));
};
+ //Отработка нажатия на отображения диалога параметров инициализации панели
+ const handleShowInitDialogClick = () => setState(pv => ({ ...pv, showInitDialog: true }));
+
+ //Отработка нажатия на "ОК" в диалоге параметров инициализации панели
+ const handleOKInitDialogClick = values =>
+ setState(pv => ({ ...pv, dateBegin: values.dateBegin, dateFact: values.dateFact, showInitDialog: false, init: false }));
+
+ //Отработка нажатия на "Отмена" в диалоге параметров инициализации панели
+ const handleCancelInitDialogClick = () => setState(pv => ({ ...pv, showInitDialog: false }));
+
//Обработка нажатия на сохранение данных в проект
const handleSaveToProjectsClick = () => saveProjects();
@@ -304,6 +453,14 @@ const PrjJobs = () => {
//Генерация содержимого
return (
+ {state.showInitDialog ? (
+
+ ) : null}
setState(pv => ({ ...pv, showProjectsList: !pv.showProjectsList }))}>
Проекты
{state.needSave ? (
@@ -321,15 +478,19 @@ const PrjJobs = () => {
>
{state.projectsLoaded ? (
<>
+
+
{state.needSave ? (
-
-
-
- save
-
-
-
-
+ <>
+
+
+ >
) : null}
>
diff --git a/app/panels/samples/data_grid.js b/app/panels/samples/data_grid.js
index 8041cb7..c5b9bc3 100644
--- a/app/panels/samples/data_grid.js
+++ b/app/panels/samples/data_grid.js
@@ -9,11 +9,12 @@
import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
-import { Typography, Grid, Stack, Icon, Box } from "@mui/material"; //Интерфейсные элементы
+import { Typography, Grid, Stack, Icon, Box, Button } from "@mui/material"; //Интерфейсные элементы
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
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"; //Контекст приложения
//---------
//Константы
@@ -25,7 +26,8 @@ const DATA_GRID_PAGE_SIZE = 5;
//Стили
const STYLES = {
CONTAINER: { textAlign: "center", paddingTop: "20px" },
- TITLE: { paddingBottom: "15px" }
+ TITLE: { paddingBottom: "15px" },
+ DATA_GRID_CONTAINER: { maxWidth: 700, maxHeight: 500, minHeight: 500 }
};
//---------------------------------------------
@@ -93,12 +95,17 @@ const DataGrid = ({ title }) => {
rows: [],
reload: true,
pageNumber: 1,
- morePages: true
+ morePages: true,
+ fixedHeader: false,
+ fixedColumns: 0
});
//Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+ //Подключение к контексту приложения
+ const { pOnlineShowDocument } = useContext(ApplicationСtx);
+
//Загрузка данных таблицы с сервера
const loadData = useCallback(async () => {
if (dataGrid.reload) {
@@ -115,6 +122,8 @@ const DataGrid = ({ title }) => {
});
setdataGrid(pv => ({
...pv,
+ fixedHeader: data.XDATA_GRID.fixedHeader,
+ fixedColumns: data.XDATA_GRID.fixedColumns,
columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
groups: data.XGROUPS
@@ -138,6 +147,9 @@ const DataGrid = ({ title }) => {
//При изменении количества отображаемых страниц
const handlePagesCountChanged = () => setdataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+ //При нажатии на копку контрагента
+ const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" });
+
//При необходимости обновить данные таблицы
useEffect(() => {
loadData();
@@ -151,14 +163,17 @@ const DataGrid = ({ title }) => {
-
+
{dataGrid.dataLoaded ? (
{
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
+ expandable={true}
+ rowExpandRender={({ row }) => (
+ handleAgnButtonClicked(row.SAGNABBR)}>Показать в разделе
+ )}
/>
) : null}
diff --git a/app/panels/samples/samples.js b/app/panels/samples/samples.js
index 323ef08..cbf8df8 100644
--- a/app/panels/samples/samples.js
+++ b/app/panels/samples/samples.js
@@ -17,6 +17,7 @@ import { Loader } from "./loader"; //Пример: Индикатор проце
import { DataGrid } from "./data_grid"; //Пример: Таблица данных "P8PDataGrid"
import { Chart } from "./chart"; //Пример: Графики "P8PChart"
import { Gantt } from "./gantt"; //Пример: Диаграмма Ганта "P8PGantt"
+import { Svg } from "./svg"; //Пример: Интерактивные изображения "P8PSVG"
//---------
//Константы
@@ -30,7 +31,8 @@ const MODES = {
LOADER: { name: "LOADER", caption: "Индикатор процесса", component: Loader },
DATAGRID: { name: "DATAGRID", caption: 'Таблица данных "P8PDataGrid"', component: DataGrid },
CHART: { name: "CHART", caption: 'Графики "P8PChart"', component: Chart },
- GANTT: { name: "GANTT", caption: 'Диаграмма Ганта "P8PGantt"', component: Gantt }
+ GANTT: { name: "GANTT", caption: 'Диаграмма Ганта "P8PGantt"', component: Gantt },
+ SVG: { name: "SVG", caption: 'Интерактивные изображения "P8PSVG"', component: Svg }
};
//Стили
diff --git a/app/panels/samples/svg.js b/app/panels/samples/svg.js
new file mode 100644
index 0000000..3df456a
--- /dev/null
+++ b/app/panels/samples/svg.js
@@ -0,0 +1,124 @@
+/*
+ Парус 8 - Панели мониторинга - Примеры для разработчиков
+ Пример: Интерактивные изображения "P8PSVG"
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useEffect } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Grid, FormControl, FormLabel, RadioGroup, FormControlLabel, Radio } from "@mui/material"; //Интерфейсные элементы
+import { P8PSVG } from "../../components/p8p_svg"; //Интерактивные изображения
+
+//---------
+//Константы
+//---------
+
+//Адрес тестового изображения
+const SAMPLE_URL = "img/sample.svg";
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center", paddingTop: "20px" },
+ TITLE: { paddingBottom: "15px" },
+ FORM: { justifyContent: "center", alignItems: "center" },
+ SVG: { height: "30vw", display: "flex", justifyContent: "center" }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Пример: Интерактивные изображения "P8PSVG"
+const Svg = ({ title }) => {
+ //Собственное состояние - SVG-изображение
+ const [svg, setSVG] = useState({
+ loaded: false,
+ data: null,
+ mode: "items1",
+ items1: [
+ { id: "1", backgroundColor: "red", desc: "Цифра на флюзеляже", title: "Цифра на флюзеляже" },
+ { id: "2", backgroundColor: "magenta", desc: "Ребро флюзеляжа", title: "Ребро флюзеляжа" },
+ { id: "3", backgroundColor: "yellow", desc: "Люк", title: "Люк" }
+ ],
+ items2: [
+ { id: "4", backgroundColor: "green", desc: "Хвост", title: "Хвост" },
+ { id: "5", backgroundColor: "blue", desc: "Хвостовой руль", title: "Хвостовой руль" },
+ { id: "6", backgroundColor: "aquamarine", desc: "Ребро жесткости хвоста", title: "Ребро жесткости хвоста" }
+ ],
+ items3: [
+ { id: "7", backgroundColor: "blueviolet", desc: "Крыло левое", title: "Крыло левое" },
+ { id: "8", backgroundColor: "orange", desc: "Двигатель левый", title: "Двигатель левый" },
+ { id: "9", backgroundColor: "springgreen", desc: "Крыло правое", title: "Крыло правое" }
+ ],
+ selectedItemDesc: ""
+ });
+
+ //Загрузка изображения
+ const loadSVG = async () => {
+ const resp = await fetch(SAMPLE_URL);
+ const data = await resp.text();
+ setSVG(pv => ({ ...pv, loaded: true, data }));
+ };
+
+ //Отработка нажатия на изображение
+ const handleSVGClick = () => {
+ setSVG(pv => ({ ...pv, selectedItemDesc: "Выбрано изображение целиком" }));
+ };
+
+ //Отработка нажатия на элемент изображения
+ const handleSVGItemClick = ({ item }) => {
+ setSVG(pv => ({ ...pv, selectedItemDesc: item?.desc ? `Выбран элемент: ${item.desc}` : "Для выбранного элемента не задано описание" }));
+ };
+
+ //При подключении к странице
+ useEffect(() => {
+ loadSVG();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ //Генерация содержимого
+ return (
+
+
+ {title}
+
+
+ Группа элементов
+ setSVG(pv => ({ ...pv, mode: e.target.value, selectedItemDesc: "" }))}>
+ } label="Первая" />
+ } label="Вторая" />
+ } label="Третья" />
+
+ {svg.selectedItemDesc ? svg.selectedItemDesc : "Нажмите на элемент изображения для получения его описания"}
+
+
+
+ {svg.loaded ? (
+
+ ) : null}
+
+
+
+ );
+};
+
+//Контроль свойств - Пример: Интерактивные изображения "P8PSVG"
+Svg.propTypes = {
+ title: PropTypes.string.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { Svg };
diff --git a/db/P8PNL_JB_PRMS.sql b/db/P8PNL_JB_PRMS.sql
new file mode 100644
index 0000000..459c429
--- /dev/null
+++ b/db/P8PNL_JB_PRMS.sql
@@ -0,0 +1,19 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Балансировка планов-графиков проектов
+ Параметры балансировки
+*/
+create table P8PNL_JB_PRMS
+(
+ RN number(17) not null, -- Рег. номер записи
+ IDENT number(17) not null, -- Идентификатор процесса
+ DATE_BEGIN date not null, -- Дата начала периода балансировки
+ DATE_FACT date not null, -- Факт по состоянию на
+ DURATION_MEAS number(1) not null, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ DURATION_MEAS_CODE varchar2(40) not null, -- Единица измерения длительности (мнемокод)
+ LAB_MEAS number(17) not null, -- Единица измерения трудоёмкости
+ LAB_MEAS_CODE varchar2(40) not null, -- Единица измерения трудоёмкости (мнемокод)
+ constraint C_P8PNL_JB_PRMS_RN_PK primary key (RN),
+ constraint C_P8PNL_JB_PRMS_LAB_MEAS_FK foreign key (LAB_MEAS) references DICMUNTS (RN) on delete cascade,
+ constraint C_P8PNL_JB_PRMS_DUR_MEAS_VAL check (DURATION_MEAS in (0, 1, 2, 3, 4, 5)),
+ constraint C_P8PNL_JB_PRMS_UN unique (IDENT)
+);
diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck
index 6f151d5..2a54068 100644
--- a/db/PKG_P8PANELS_BASE.pck
+++ b/db/PKG_P8PANELS_BASE.pck
@@ -1,7 +1,11 @@
create or replace package PKG_P8PANELS_BASE as
/*Константы - Типовой постфикс тега для массива (при переводе XML -> JSON) */
- SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__';
+ SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__';
+
+ /* Константы - признаки наличия доступа */
+ NACCESS_YES constant number(1) := 1; -- Доступ есть
+ NACCESS_NO constant number(1) := 0; -- Доступа нет
/* Конвертация строки в число */
function UTL_S2N
@@ -15,6 +19,14 @@ create or replace package PKG_P8PANELS_BASE as
SVALUE in varchar2 -- Конвертируемое строковое значение
) return date; -- Конвертированная дата
+ /* Проверка доступности документа */
+ function UTL_DOC_ACCESS_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SUNIT_CODE in varchar2, -- Код раздела
+ NDOCUMENT in number -- Рег. номер документа
+ ) return number; -- Флаг доступности (см. константы NACCESS_*)
+
/* Базовое исполнение действий */
procedure PROCESS
(
@@ -132,6 +144,53 @@ create or replace package body PKG_P8PANELS_BASE as
P_EXCEPTION(0, 'Неверный формат даты (%s).', SVALUE);
end UTL_S2D;
+ /* Проверка доступности документа */
+ function UTL_DOC_ACCESS_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SUNIT_CODE in varchar2, -- Код раздела
+ NDOCUMENT in number -- Рег. номер документа
+ ) return number -- Флаг доступности (см. константы NACCESS_*)
+ is
+ NRES PKG_STD.TNUMBER; -- Буфер для результата
+ NVERSION PKG_STD.TREF; -- Рег. номер версии
+ NCATALOG PKG_STD.TREF; -- Рег. номер каталога
+ NJUR_PERS PKG_STD.TREF; -- Рег. номер юридической принадлежности
+ NHIERARCHY PKG_STD.TREF; -- Рег. номер ирерархии
+ BTMP boolean; -- Буфер для расчетов
+ NTMP PKG_STD.TNUMBER; -- Буфер для расчетов
+ begin
+ /* Считаем стандартную атрибутику */
+ PKG_DOCUMENT.GET_ATTRS(NFLAG_SMART => 0,
+ SUNITCODE => SUNIT_CODE,
+ NDOCUMENT => NDOCUMENT,
+ BFOUND => BTMP,
+ NCOMPANY => NTMP,
+ NVERSION => NVERSION,
+ NCATALOG => NCATALOG,
+ NJUR_PERS => NJUR_PERS,
+ NHIERARCHY => NHIERARCHY);
+ /* Проверким доступ */
+ PKG_ENV.SMART_ACCESS(NCOMPANY => NCOMPANY,
+ NVERSION => NVERSION,
+ NCATALOG => NCATALOG,
+ NJUR_PERS => NJUR_PERS,
+ NHIERARCHY => NHIERARCHY,
+ SUNIT => SUNIT_CODE,
+ SACTION => null,
+ NRESULT => NRES);
+ /* Вернём результат */
+ if (NRES = 1) then
+ return NACCESS_YES;
+ else
+ return NACCESS_NO;
+ end if;
+ exception
+ /* В случае ошибки - доступ закрыт */
+ when others then
+ return NACCESS_NO;
+ end UTL_DOC_ACCESS_CHECK;
+
/* Формирование сообщения об отсутствии значения */
function MSG_NO_DATA_MAKE
(
diff --git a/db/PKG_P8PANELS_EQUIPSRV.pck b/db/PKG_P8PANELS_EQUIPSRV.pck
index 3deb778..22d188c 100644
--- a/db/PKG_P8PANELS_EQUIPSRV.pck
+++ b/db/PKG_P8PANELS_EQUIPSRV.pck
@@ -226,9 +226,9 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SPRJ_GROUP_NAME PKG_STD.TSTRING; -- Наименование группы для проекта
BEXPANDED boolean; -- Флаг раскрытости уровня
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
- RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0
- RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
- RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2
+ RDG_ROW_INFO PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с информацией по объекту ремонта
+ RDG_ROW_PLAN PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с планом по объекту ремонта
+ RDG_ROW_FACT PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с фактом по объекту ремонта
NCURYEAR PKG_STD.TNUMBER; -- Текущий год
NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц
NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце
@@ -270,7 +270,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
TT.DDATEPRD_BEG DDATEPLANBEG,
TT.DDATEPRD_END DDATEPLANEND,
EQJ.DATEFACT_BEG DDATEFACTBEG,
- COALESCE(EQJ.DATEFACT_END, EQJ.DATEFACT_BEG) DDATEFACTEND, --
+ COALESCE(EQJ.DATEFACT_END, EQJ.DATEFACT_BEG) DDATEFACTEND,
EK.CODE STECSRVKINDCODE,
EK.NAME STECSRVKINDNAME,
COALESCE(EW.NSUM, (TT.DDATEPRD_END - TT.DDATEPRD_BEG) * 24) NSUMWORKPLAN,
@@ -554,7 +554,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Если новый объект ремонта */
if ((SCURTECHOBJ != QQ.STECHOBJNAME) or (SCURTECHOBJ is null)) then
/* Если строка с трудоёмкостью по объекту ремонта сформирована */
- if (RDG_ROW0.RCOLS is not null) then
+ if (RDG_ROW_INFO.RCOLS is not null) then
/* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR
loop
@@ -562,7 +562,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
if (NFROMYEAR = NTOYEAR) then
NMS := NFROMMONTH;
NME := NTOMONTH;
- /* Иначе вычисляем кол-во месяцев в каждом году периода отчёта*/
+ /* Иначе вычисляем кол-во месяцев в каждом году периода отчёта */
else
if (Y = NFROMYEAR) then
NMS := NFROMMONTH;
@@ -579,7 +579,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
for M in NMS .. NME
loop
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO,
SNAME => SPERIODNAME,
SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_P'),
@@ -594,7 +594,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
end loop;
end loop;
/* Добавление строки с трудоёмкостью */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO);
end if;
/* Добавление группы с объектом ремонта */
SCURTECHOBJ := QQ.STECHOBJNAME;
@@ -603,29 +603,29 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SNAME => SPRJ_GROUP_NAME,
SCAPTION => QQ.STECHOBJNAME,
BEXPANDABLE => false);
- RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ);
+ RDG_ROW_INFO := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ);
end if;
/* Формируем имя группы для вида ремонта */
SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE;
/* Если по данной группе еще нет строк плана и факта */
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => GF, SROWID => SCURTSKCODE) = false) then
/* Добавляем строку плана */
- if (RDG_ROW.RCOLS is not null) then
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ if (RDG_ROW_PLAN.RCOLS is not null) then
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN);
end if;
/* Добавляем строку факта */
- if (RDG_ROW2.RCOLS is not null) then
+ if (RDG_ROW_FACT.RCOLS is not null) then
CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
/* Цикл по коллекции для закрашивания месяцев */
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
loop
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2,
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT,
SNAME => CR,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
end loop;
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT);
end if;
PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
/* Добвим группу для вида ремонта */
@@ -635,12 +635,12 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SCAPTION => QQ.STECSRVKINDCODE,
BEXPANDABLE => false);
/* Строка плана */
- RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SWRKTYPE', SVALUE => 'План');
+ RDG_ROW_PLAN := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SWRKTYPE', SVALUE => 'План');
/* Строка факта */
- RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SWRKTYPE', SVALUE => 'Факт');
+ RDG_ROW_FACT := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT, SNAME => 'SWRKTYPE', SVALUE => 'Факт');
/* Добавляем в заполненные группы */
PKG_CONTVALLOC1S.PUTS(RCONTAINER => GF, SROWID => SPRJ_GROUP_NAME, SVALUE => '');
end if;
@@ -665,7 +665,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Закрашивание месяца плана синим */
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') =
false) then
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue');
PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS,
SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN',
SVALUE => '');
@@ -675,7 +675,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Закрашивание дня плана синим */
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') =
false) then
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue');
PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS,
SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN',
SVALUE => '');
@@ -749,7 +749,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
end if;
end loop;
end if;
- if ((RDG_ROW0.RCOLS is not null) and (NROWS = 0)) then
+ if ((RDG_ROW_INFO.RCOLS is not null) and (NROWS = 0)) then
/* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR
loop
@@ -772,7 +772,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
for M in NMS .. NME
loop
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO,
SNAME => SPERIODNAME,
SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_P'),
@@ -782,23 +782,23 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
1)));
end loop;
end loop;
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO);
end if;
/* План для последней записи */
- if ((RDG_ROW.RCOLS is not null) and (NROWS = 0)) then
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ if ((RDG_ROW_PLAN.RCOLS is not null) and (NROWS = 0)) then
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN);
end if;
/* Факт для последней записи */
- if ((RDG_ROW2.RCOLS is not null) and (NROWS = 0)) then
+ if ((RDG_ROW_FACT.RCOLS is not null) and (NROWS = 0)) then
CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
loop
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2,
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT,
SNAME => CR,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
end loop;
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT);
end if;
end loop;
/* Сериализуем описание */
diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck
index 74354d9..4d7fda5 100644
--- a/db/PKG_P8PANELS_MECHREC.pck
+++ b/db/PKG_P8PANELS_MECHREC.pck
@@ -1,4 +1,20 @@
create or replace package PKG_P8PANELS_MECHREC as
+
+ /* Проверка соответствия подразделения документа подразделению пользователя */
+ function UTL_SUBDIV_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NSUBDIV in number, -- Рег. номер подразделения
+ SUSER in varchar2 -- Имя пользователя
+ ) return number; -- Подразделение подходит (0 - нет, 1 - да)
+
+ /* Проверка соответствия подразделения документа подразделению пользователя (по иерархии) */
+ function UTL_SUBDIV_HIER_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NSUBDIV in number, -- Рег. номер подразделения
+ SUSER in varchar2 -- Имя пользователя
+ ) return number; -- Подразделение подходит (0 - нет, 1 - да)
/* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
procedure INCOMEFROMDEPS_DG_GET
@@ -26,12 +42,12 @@ create or replace package PKG_P8PANELS_MECHREC as
/* Получение товарных запасов на основании маршрутного листа */
procedure GOODSPARTIES_DG_GET
(
- NFCROUTLST in number, -- Рег. номер маршрутного листа
- NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
- NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
- CORDERS in clob, -- Сортировки
- NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
- COUT out clob -- Сериализованная таблица данных
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
);
/* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
@@ -56,12 +72,199 @@ create or replace package PKG_P8PANELS_MECHREC as
NMAX_LEVEL out number -- Максимальный уровень иерархии
);
- /* Инициализация каталогов раздела "Планы и отчеты производства изделий" */
- procedure ACATALOG_INIT
+ /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Производственная программа" */
+ procedure FCPRODPLAN_PP_CTLG_INIT
(
COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
);
+ /* Изменение приоритета партии маршрутного листа */
+ procedure FCROUTLST_PRIOR_PARTY_UPDATE
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SPRIOR_PARTY in varchar -- Новое значение приоритета партии
+ );
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана */
+ procedure FCROUTLST_DEPT_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы строк маршрутного листа */
+ procedure FCROUTLSTSP_DEPT_DG_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
+ procedure INCOMEFROMDEPS_DEPT_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы спецификаций планов и отчетов производства изделий */
+ procedure FCPRODPLANSP_DEPT_DG_GET
+ (
+ NFCPRODPLAN in number, -- Рег. номер планов и отчетов производства изделий
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
+ procedure FCPRODPLAN_DEPT_INIT
+ (
+ COUT out clob -- Список записей раздела "Планы и отчеты производства изделий"
+ );
+
+ /* Добавление записи маршрутного листа в селектлисте */
+ procedure SELECTLIST_FCROUTLST_ADD
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ );
+
+ /* Удаление записи маршрутного листа из селектлиста */
+ procedure SELECTLIST_FCROUTLST_DEL
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ );
+
+ /* Выдать задание операции сменного задания */
+ procedure FCJOBSSP_ISSUE
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ );
+
+ /* Исключение оборудования из операции сменного задания */
+ procedure FCJOBSSP_EXC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ );
+
+ /* Включение оборудование в строку сменного задания */
+ procedure FCJOBSSP_INC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ );
+
+ /* Получение таблицы оборудования подразделения */
+ procedure FCEQUIPMENT_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы маршрутных листов спецификации сменного задания */
+ procedure FCJOBSSP_FCROUTLST_DG_GET
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение спецификации сменного задания по отмеченным маршрутным листам */
+ procedure FCJOBSSP_DG_GET
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ NIDENT in number, -- Идентификатор процесса
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
+ procedure FCJOBS_INIT
+ (
+ COUT out clob -- Список записей раздела "Сменные задания"
+ );
+
+ /* Получение загрузки цеха */
+ procedure FCJOBS_DEP_LOAD_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы маршрутных листов, связанных с производственным составом */
+ procedure FCROUTLST_DG_BY_PRDCMPSP_GET
+ (
+ NPRODCMPSP in number, -- Рег. номер производственного состава
+ NFCPRODPLAN in number, -- Рег. номер план
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы комплектовочных ведомостей, связанных с производственным составом */
+ procedure FCDELIVSH_DG_BY_PRDCMPSP_GET
+ (
+ NPRODCMPSP in number, -- Рег. номер производственного состава
+ NFCPRODPLAN in number, -- Рег. номер план
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы записей "Планы и отчеты производства изделий" */
+ procedure FCPRODPLAN_GET
+ (
+ NCRN in number, -- Рег. номер каталога
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Мониторинг сборки изделий" */
+ procedure FCPRODPLAN_AM_CTLG_INIT
+ (
+ COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
+ );
+
+ /* Считывание деталей производственного состава */
+ procedure FCPRODCMP_DETAILS_GET
+ (
+ NFCPRODPLAN in number, -- Рег. номер плана
+ COUT out clob -- Сериализованная таблица данных
+ );
+
end PKG_P8PANELS_MECHREC;
/
create or replace package body PKG_P8PANELS_MECHREC as
@@ -74,11 +277,43 @@ create or replace package body PKG_P8PANELS_MECHREC as
SBG_COLOR_BLACK constant PKG_STD.TSTRING := '#00000080'; -- Цвет заливки черный
STEXT_COLOR_ORANGE constant PKG_STD.TSTRING := '#FF8C00'; -- Цвет текста оранжевый
STEXT_COLOR_GREY constant PKG_STD.TSTRING := '#555'; -- Цвет текста серый
-
- /* Константы - параметры отборов планов */
+
+ /* Константы - параметры отборов планов ("Производственная программа") */
NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа"
NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден"
SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
+ NMAX_TASKS constant PKG_STD.TNUMBER := 10000; -- Максимальное количество отображаемых задач
+
+ /* Константы - классы задач плана ("Производственная программа") */
+ NCLASS_WO_DEFICIT constant PKG_STD.TNUMBER := 0; -- Без дефицита выпуска
+ NCLASS_PART_DEFICIT constant PKG_STD.TNUMBER := 1; -- С частичным дефицитом выпуска
+ NCLASS_FULL_DEFICIT constant PKG_STD.TNUMBER := 2; -- С полным дефицитом выпуска
+ NCLASS_WITH_DEFICIT constant PKG_STD.TNUMBER := 3; -- С дефицитом запуска или датой меньше текущей
+ NCLASS_FUTURE_DATE constant PKG_STD.TNUMBER := 4; -- Дата анализа еще не наступила
+ NCLASS_WO_LINKS constant PKG_STD.TNUMBER := 5; -- Задача без связи
+
+ /* Константы - типы задач плана, содержание детализации ("Производственная программа") */
+ NTASK_TYPE_RL_WITH_GP constant PKG_STD.TNUMBER := 0; -- Маршрутные листы с развертыванием товарных запасов
+ NTASK_TYPE_RL_WITH_DL constant PKG_STD.TNUMBER := 1; -- Маршрутные листы с развертыванием комплектаций
+ NTASK_TYPE_INC_DEPS constant PKG_STD.TNUMBER := 2; -- Приход из подразделений
+ NTASK_TYPE_INC_DEPS_RL constant PKG_STD.TNUMBER := 3; -- Приход из подразделений и маршрутные листы
+ NTASK_TYPE_RL constant PKG_STD.TNUMBER := 4; -- Маршрутные листы
+ NTASK_TYPE_EMPTY constant PKG_STD.TNUMBER := null; -- Нет детализации
+
+ /* Константы - параметры отборов планов (Производственный план цеха) */
+ NFCPRODPLAN_DEPT_CTGR constant PKG_STD.TNUMBER := 2; -- Категория планов "Цеховой план"
+
+ /* Константы - параметры отборов планов ("Мониторинг сборки изделий") */
+ NFCPRODPLAN_CATEGORY_MON constant PKG_STD.TNUMBER := 0; -- Категория планов "Первичный документ"
+ NFCPRODPLAN_STATUS_MON constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден"
+ SFCPRODPLAN_TYPE_MON constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
+
+ /* Константы - параметры отборов ("Загрузка цеха") */
+ SDICMUNTS_WD constant PKG_STD.TSTRING := 'Ч/Ч'; -- Мнемокод ед. измерения нормочасов
+ SDICMUNTS_HOUR constant PKG_STD.TSTRING := 'Час'; -- Мнемокод ед. измерения часов
+
+ /* Константы - параметры отборов сменных заданий */
+ NFCJOBS_STATUS_WO constant PKG_STD.TNUMBER := 1; -- Статус сменного задания "Отработан"
/* Константы - дополнительные атрибуты */
STASK_ATTR_START_FACT constant PKG_STD.TSTRING := 'start_fact'; -- Запущено
@@ -88,22 +323,67 @@ create or replace package body PKG_P8PANELS_MECHREC as
STASK_ATTR_DL constant PKG_STD.TSTRING := 'detail_list'; -- Связанные документы
STASK_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
STASK_ATTR_MEAS constant PKG_STD.TSTRING := 'meas'; -- Единица измнения
+
+ /* Константы - дополнительные параметры */
+ SCOL_PATTERN_DATE constant PKG_STD.TSTRING := 'dd_mm_yyyy'; -- Паттерн для динамической колонки граф ("день_месяц_год")
+ SFCROUTLSTSP_STATE_DOMAIN constant PKG_STD.TSTRING := 'TFCROUTLSTSP_STATE'; -- Мнемокод домена состояния спецификации маршрутного листа
+
+ /* Константы - типовые присоединённые документы */
+ SFLINKTYPE_PREVIEW constant PKG_STD.TSTRING := 'Предпросмотр'; -- Тип ПД для изображений предпросмотра
+ SFLINKTYPE_SVG_MODEL constant PKG_STD.TSTRING := 'Векторная модель'; -- Тип ПД для SVG-модели
+
+ /* Константы - дополнительные свойства */
+ SDP_MODEL_ID constant PKG_STD.TSTRING := 'ПУДП.MODEL_ID'; -- Идентификатор в SVG-модели
+ SDP_MODEL_BG_COLOR constant PKG_STD.TSTRING := 'ПУДП.MODEL_BG_COLOR'; -- Цвет заливки в SVG-модели
+ /* Экземпляр дня загрузки цеха */
+ type TJOB_DAY is record
+ (
+ DDATE PKG_STD.TLDATE, -- Дата дня загрузки цеха
+ NVALUE PKG_STD.TQUANT, -- Значение доли трудоемкости смены
+ NTYPE PKG_STD.TNUMBER -- Тип дня (0 - выполняемый, 1 - выполненный)
+ );
+
+ /* Коллекция дней загрузки цеха */
+ type TJOB_DAYS is table of TJOB_DAY;
+
+ /* Добавление дня в коллекцию дней загрузки цеха */
+ procedure TJOB_DAYS_ADD
+ (
+ TDAYS in out nocopy TJOB_DAYS, -- Коллекция дней загрузки цеха
+ DDATE in date, -- Дата дня загрузки цеха
+ NVALUE in number, -- Значение доли трудоемкости смены
+ NTYPE in number, -- Тип дня (0 - выполняемый, 1 - выполненный)
+ BCLEAR in boolean := false -- Признак очистки результирующей коллекции перед добавлением таблицы
+ )
+ is
+ begin
+ /* Инициализируем коллекцию таблиц документа */
+ if ((TDAYS is null) or (BCLEAR)) then
+ TDAYS := TJOB_DAYS();
+ end if;
+ /* Добавляем таблицу к документу */
+ TDAYS.EXTEND();
+ TDAYS(TDAYS.LAST).DDATE := DDATE;
+ TDAYS(TDAYS.LAST).NVALUE := NVALUE;
+ TDAYS(TDAYS.LAST).NTYPE := NTYPE;
+ end TJOB_DAYS_ADD;
+
/* Инциализация списка маршрутных листов (с иерархией) */
procedure UTL_FCROUTLST_IDENT_INIT
(
- NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
- NIDENT out number -- Идентификатор отмеченных записей
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NIDENT out number -- Идентификатор отмеченных записей
)
is
/* Рекурсивная процедура формирования списка маршрутных листов */
procedure PUT_FCROUTLST
(
- NIDENT in number, -- Идентификатор отмеченных записей
- NFCROUTLST in number -- Рег. номер маршрутного листа
+ NIDENT in number, -- Идентификатор отмеченных записей
+ NFCROUTLST in number -- Рег. номер маршрутного листа
)
is
- NTMP PKG_STD.TNUMBER; -- Буфер
+ NTMP PKG_STD.TNUMBER; -- Буфер
begin
/* Добавление в список */
begin
@@ -142,6 +422,250 @@ create or replace package body PKG_P8PANELS_MECHREC as
end loop;
end UTL_FCROUTLST_IDENT_INIT;
+ /* Считывание записи маршрутного листа */
+ procedure UTL_FCROUTLST_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ RFCROUTLST out FCROUTLST%rowtype -- Запись маршрутного листа
+ )
+ is
+ begin
+ /* Считываем запись маршрутного листа */
+ begin
+ select T.* into RFCROUTLST from FCROUTLST T where T.RN = NFCROUTLST;
+ exception
+ when others then
+ PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NFCROUTLST, SUNIT_TABLE => 'FCROUTLST');
+ end;
+ end UTL_FCROUTLST_GET;
+
+ /* Получение мнемокода подразделения пользователя */
+ function UTL_SUBDIV_CODE_GET
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SUSER in varchar2 -- Имя пользователя
+ ) return varchar2 -- Мнемокод подразделения пользователя
+ is
+ SRESULT PKG_STD.TSTRING; -- Мнемокод подразделения пользователя
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Считываем мнемокод подразделения пользователя */
+ begin
+ select I.CODE
+ into SRESULT
+ from CLNPSPFM C,
+ CLNPSPFMTYPES CT,
+ INS_DEPARTMENT I
+ where exists (select null
+ from CLNPERSONS CP
+ where exists (select null
+ from AGNLIST T
+ where T.PERS_AUTHID = SUSER
+ and CP.PERS_AGENT = T.RN
+ and T.VERSION = NVERSION)
+ and C.PERSRN = CP.RN
+ and CP.COMPANY = NCOMPANY)
+ and C.COMPANY = NCOMPANY
+ and C.BEGENG <= sysdate
+ and (C.ENDENG >= sysdate or C.ENDENG is null)
+ and C.CLNPSPFMTYPES = CT.RN
+ and CT.IS_PRIMARY = 1
+ and I.RN = C.DEPTRN
+ and ROWNUM = 1;
+ exception
+ when others then
+ SRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return SRESULT;
+ end UTL_SUBDIV_CODE_GET;
+
+ /* Проверка соответствия подразделения документа подразделению пользователя */
+ function UTL_SUBDIV_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NSUBDIV in number, -- Рег. номер подразделения
+ SUSER in varchar2 -- Имя пользователя
+ ) return number -- Подразделение подходит (0 - нет, 1 - да)
+ is
+ NRESULT PKG_STD.TNUMBER; -- Подразделение подходит (0 - нет, 1 - да)
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ begin
+ /* Если рег. номер подразделения пустой */
+ if (NSUBDIV is null) then
+ /* Возвращаем 0 */
+ return 0;
+ end if;
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Проверяем подразделение по исполнению сотрудника пользователя */
+ begin
+ select 1
+ into NRESULT
+ from DUAL
+ where NSUBDIV in (select C.DEPTRN
+ from CLNPSPFM C,
+ CLNPSPFMTYPES CT
+ where exists (select null
+ from CLNPERSONS CP
+ where exists (select null
+ from AGNLIST T
+ where T.PERS_AUTHID = SUSER
+ and CP.PERS_AGENT = T.RN
+ and T.VERSION = NVERSION)
+ and C.PERSRN = CP.RN
+ and CP.COMPANY = NCOMPANY)
+ and C.COMPANY = NCOMPANY
+ and C.BEGENG <= sysdate
+ and (C.ENDENG >= sysdate or C.ENDENG is null)
+ and C.CLNPSPFMTYPES = CT.RN
+ and CT.IS_PRIMARY = 1);
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_SUBDIV_CHECK;
+
+ /* Проверка соответствия подразделения документа подразделению пользователя (по иерархии) */
+ function UTL_SUBDIV_HIER_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NSUBDIV in number, -- Рег. номер подразделения
+ SUSER in varchar2 -- Имя пользователя
+ ) return number -- Подразделение подходит (0 - нет, 1 - да)
+ is
+ NRESULT PKG_STD.TNUMBER; -- Подразделение подходит (0 - нет, 1 - да)
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ begin
+ /* Если рег. номер подразделения пустой */
+ if (NSUBDIV is null) then
+ /* Возвращаем 0 */
+ return 0;
+ end if;
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Проверяем подразделение по исполнению сотрудника пользователя */
+ begin
+ select 1
+ into NRESULT
+ from DUAL
+ where exists (select null
+ from INS_DEPARTMENT T,
+ (select C.DEPTRN
+ from CLNPSPFM C,
+ CLNPSPFMTYPES CT
+ where exists (select null
+ from CLNPERSONS CP
+ where exists (select null
+ from AGNLIST T
+ where T.PERS_AUTHID = SUSER
+ and CP.PERS_AGENT = T.RN
+ and T.VERSION = NVERSION)
+ and C.PERSRN = CP.RN
+ and CP.COMPANY = NCOMPANY)
+ and C.COMPANY = NCOMPANY
+ and C.BEGENG <= sysdate
+ and (C.ENDENG >= sysdate or C.ENDENG is null)
+ and C.CLNPSPFMTYPES = CT.RN
+ and CT.IS_PRIMARY = 1) TMP
+ where T.RN = NSUBDIV
+ and ROWNUM = 1
+ start with T.RN = TMP.DEPTRN
+ connect by prior T.RN = T.PRN);
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_SUBDIV_HIER_CHECK;
+
+ /* Проверка наличия оборудования */
+ procedure UTL_FCEQUIPMENT_EXISTS
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NCOMPANY in number -- Рег. номер организации
+ )
+ is
+ NEXISTS PKG_STD.TNUMBER; -- Буфер
+ begin
+ /* Проверяем наличие оборудования */
+ begin
+ select T.RN
+ into NEXISTS
+ from FCEQUIPMENT T
+ where T.RN = NFCEQUIPMENT
+ and T.COMPANY = NCOMPANY;
+ exception
+ when others then
+ P_EXCEPTION(0, 'Оборудование не найдено.');
+ end;
+ end UTL_FCEQUIPMENT_EXISTS;
+
+ /* Поиск записи в селектлисте */
+ function UTL_SELECTLIST_RN_GET
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SUNITCODE in varchar2, -- Мнемокод раздела
+ SACTIONCODE in varchar2 -- Действие раздела
+ ) return number -- Рег. номер записи в селектлисте
+ is
+ NRESULT PKG_STD.TNUMBER; -- Рег. номер записи в селектлисте
+ begin
+ /* Считываем запись селеклиста */
+ begin
+ select T.RN
+ into NRESULT
+ from SELECTLIST T
+ where T.IDENT = NIDENT
+ and T.UNITCODE = SUNITCODE
+ and T.DOCUMENT = NFCROUTLST
+ and T.ACTIONCODE = SACTIONCODE;
+ exception
+ when others then
+ NRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_SELECTLIST_RN_GET;
+
+ /* Считывание рег. номера основной спецификации плана из "Производственная программа" */
+ function UTL_FCPRODPLANSP_MAIN_GET
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NFCPRODPLANSP in number -- Рег. номер связанной спецификации плана
+ ) return number -- Рег. номер основной спецификации плана из "Производственная программа"
+ is
+ NRESULT PKG_STD.TREF; -- Рег. номер основной спецификации плана из "Производственная программа"
+ begin
+ /* Поиск связанной спецификации из "Производственная программа" */
+ begin
+ select S.RN
+ into NRESULT
+ from DOCLINKS T,
+ FCPRODPLANSP S,
+ FCPRODPLAN P
+ where T.OUT_DOCUMENT = NFCPRODPLANSP
+ and T.IN_UNITCODE = 'CostProductPlansSpecs'
+ and T.OUT_UNITCODE = 'CostProductPlansSpecs'
+ and S.RN = T.IN_DOCUMENT
+ and P.RN = S.PRN
+ and P.CATEGORY = NFCPRODPLAN_CATEGORY
+ and P.COMPANY = NCOMPANY
+ and ROWNUM = 1;
+ exception
+ when others then
+ NRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_FCPRODPLANSP_MAIN_GET;
+
/* Проверка наличия связанных маршрутных листов */
function LINK_FCROUTLST_CHECK
(
@@ -229,6 +753,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
raise;
end LINK_INCOMEFROMDEPS_CHECK;
+ /*
+ Процедуры панели "Производственная программа"
+ */
+
/* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
procedure INCOMEFROMDEPS_DG_GET
(
@@ -271,8 +799,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
SCAPTION => 'Накладная',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => true);
- /* Если тип = 3, то необходимо включать состояние */
- if (NTYPE = 3) then
+ /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */
+ if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SDOC_STATE',
SCAPTION => 'Состояние',
@@ -402,8 +930,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
SNAME => 'SDOC_INFO',
ICURSOR => ICURSOR,
NPOSITION => 2);
- /* Если тип = 3, то необходимо включать состояние */
- if (NTYPE = 3) then
+ /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */
+ if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SDOC_STATE',
ICURSOR => ICURSOR,
@@ -444,7 +972,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
raise;
end INCOMEFROMDEPS_DG_GET;
-
+
/* Получение таблицы строк комплектации на основании маршрутного листа */
procedure FCDELIVERYLISTSP_DG_GET
(
@@ -632,7 +1160,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCDELIVERYLISTSP_DG_GET;
-
+
/* Получение таблицы товарных запасов на основании маршрутного листа */
procedure GOODSPARTIES_DG_GET
(
@@ -840,7 +1368,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end GOODSPARTIES_DG_GET;
-
+
/* Получение таблицы маршрутных листов, связанных со спецификацией плана (по детали) */
procedure FCROUTLST_DG_BY_DTL
(
@@ -1038,7 +1566,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCROUTLST_DG_BY_DTL;
-
+
/* Получение таблицы маршрутных листов, связанных со спецификацией плана (по изделию) */
procedure FCROUTLST_DG_BY_PRDCT
(
@@ -1223,7 +1751,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCROUTLST_DG_BY_PRDCT;
-
+
/* Получение таблицы маршрутных листов, связанных со спецификацией плана (для приходов) */
procedure FCROUTLST_DG_BY_DEPS
(
@@ -1329,7 +1857,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DREL_DATE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NREL_QUANT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT_FACT,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 3) else 0 end NPROCENT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,');
@@ -1361,7 +1889,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
@@ -1373,7 +1901,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
@@ -1449,12 +1977,12 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCROUTLST_DG_BY_DEPS;
-
+
/* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
procedure FCROUTLST_DG_GET
(
NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
- NTYPE in number, -- Тип спецификации плана (0 - Деталь, 1 - Изделие/сборочная единица, 3/4 - ПиП)
+ NTYPE in number, -- Тип спецификации плана (см. константы NTASK_TYPE_*)
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
CORDERS in clob, -- Сортировки
@@ -1466,7 +1994,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Выбираем сборку таблицы, исходя из типа спецификации плана */
case
/* Деталь */
- when (NTYPE = 0) then
+ when (NTYPE = NTASK_TYPE_RL_WITH_GP) then
/* Получаем таблицу по детали */
FCROUTLST_DG_BY_DTL(NFCPRODPLANSP => NFCPRODPLANSP,
NPAGE_NUMBER => NPAGE_NUMBER,
@@ -1475,7 +2003,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NINCLUDE_DEF => NINCLUDE_DEF,
COUT => COUT);
/* Изделие/сборочная единица */
- when (NTYPE = 1) then
+ when (NTYPE = NTASK_TYPE_RL_WITH_DL) then
/* Получаем таблицу по изделию */
FCROUTLST_DG_BY_PRDCT(NFCPRODPLANSP => NFCPRODPLANSP,
NPAGE_NUMBER => NPAGE_NUMBER,
@@ -1484,7 +2012,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NINCLUDE_DEF => NINCLUDE_DEF,
COUT => COUT);
/* Для приходов из подразделений */
- when ((NTYPE = 3) or (NTYPE = 4)) then
+ when ((NTYPE = NTASK_TYPE_INC_DEPS_RL) or (NTYPE = NTASK_TYPE_RL)) then
/* Получаем таблицу по приходу */
FCROUTLST_DG_BY_DEPS(NFCPRODPLANSP => NFCPRODPLANSP,
NPAGE_NUMBER => NPAGE_NUMBER,
@@ -1497,174 +2025,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
'Не определен тип получения таблицы маршрутных листов.');
end case;
end FCROUTLST_DG_GET;
-
- /* Формирование характеристик спецификации в Ганте */
- procedure MAKE_GANT_ITEM
- (
- 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, -- Цвет заливки прогресса спецификации
- STASK_TEXT_COLOR in out varchar2, -- Цвет текста
- NTASK_PROGRESS out number -- Прогресс спецификации
- )
- is
- begin
- /* Если дефицит запуска <> 0 */
- if (NDEFRESLIZ <> 0) then
- /* Если дефицит выпуска = 0 */
- if (NDEFSTART = 0) then
- /* Полностью зеленый */
- STASK_BG_COLOR := SBG_COLOR_GREEN;
- STASK_TEXT_COLOR := STEXT_COLOR_GREY;
- 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
- /* Полностью зеленый */
- STASK_BG_COLOR := SBG_COLOR_GREEN;
- STASK_TEXT_COLOR := STEXT_COLOR_GREY;
- 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;
- STASK_TEXT_COLOR := STEXT_COLOR_GREY;
- NTASK_PROGRESS := ROUND(NREL_FACT / NMAIN_QUANT * 100);
- end if;
- end if;
- end if;
- end MAKE_GANT_ITEM;
-
- /* Считывание максимального уровня иерархии плана по каталогу */
- function PRODPLAN_MAX_LEVEL_GET
- (
- NCRN in number -- Рег. номер каталога планов
- ) return number -- Максимальный уровень иерархии
- is
- NRESULT PKG_STD.TNUMBER; -- Максимальный уровень иерархии
- begin
- /* Считываем максимальный уровень */
- begin
- select max(level)
- into NRESULT
- from (select T.RN,
- T.UP_LEVEL
- 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
- and T.MAIN_QUANT > 0) 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, -- Цвет элемента
- STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет прогресса элемента
- STASK_TEXT_COLOR out varchar2, -- Цвет текста элемента
- NTASK_PROGRESS out number -- Прогресс элемента
- )
- is
- begin
- /* Проициниализируем цвет и прогресс */
- STASK_BG_COLOR := null;
- STASK_TEXT_COLOR := null;
- STASK_BG_PROGRESS_COLOR := null;
- NTASK_PROGRESS := 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;
- /* Если нет связанных документов */
- if (NHAVE_LINK = 0) then
- /* Если дата запуска меньше текущей даты */
- if (DREP_DATE <= sysdate) then
- /* Закрашиваем в красный */
- STASK_BG_COLOR := SBG_COLOR_RED;
- STASK_TEXT_COLOR := null;
- NTASK_PROGRESS := null;
- end if;
- /* Если дата больше текущей даты */
- if (DREP_DATE > sysdate) then
- /* Закрашиваем в серый */
- STASK_BG_COLOR := SBG_COLOR_GREY;
- STASK_TEXT_COLOR := null;
- NTASK_PROGRESS := null;
- end if;
- end if;
- end FCPRODPLANSP_DATES_GET;
-
+
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET
(
@@ -1686,10 +2047,12 @@ create or replace package body PKG_P8PANELS_MECHREC as
DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации
DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации
STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте
- NTYPE PKG_STD.TNUMBER; -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
+ NTYPE PKG_STD.TNUMBER; -- Тип задачи (см. константы NTASK_TYPE_*)
SDETAIL_LIST PKG_STD.TSTRING; -- Ссылки на детализацию
SPLAN_TITLE PKG_STD.TSTRING; -- Заголовок плана
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ NTASK_CLASS PKG_STD.TNUMBER; -- Класс задачи (см. константы NCLASS_*)
+ NLEVEL_FILTER PKG_STD.TNUMBER; -- Уровень для фильтра
/* Объединение значений в строковое представление */
function MAKE_INFO
@@ -1710,10 +2073,92 @@ create or replace package body PKG_P8PANELS_MECHREC as
return SRESULT;
end MAKE_INFO;
+ /* Считывание максимального уровня иерархии плана по каталогу */
+ function PRODPLAN_MAX_LEVEL_GET
+ (
+ NCRN in number -- Рег. номер каталога планов
+ ) return number -- Максимальный уровень иерархии
+ is
+ NRESULT PKG_STD.TNUMBER := 1; -- Максимальный уровень иерархии
+ NTOTAL PKG_STD.TNUMBER := 0; -- Сумма документов по проверяемому уровню
+ begin
+ /* Цикл по уровням каталога планов */
+ for REC in (select level,
+ count(TMP.RN) COUNT_DOCS
+ from (select T.RN,
+ T.UP_LEVEL
+ 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
+ and T.MAIN_QUANT > 0) TMP
+ connect by prior TMP.RN = TMP.UP_LEVEL
+ start with TMP.UP_LEVEL is null
+ group by level
+ order by level)
+ loop
+ /* Получаем количество задач с учетом текущего уровня */
+ NTOTAL := NTOTAL + REC.COUNT_DOCS;
+ /* Если сумма документов по текущему уровню превышает максимальное количество задач */
+ if (NTOTAL >= NMAX_TASKS) then
+ /* Выходим из цикла */
+ exit;
+ end if;
+ /* Указываем текущий уровень */
+ NRESULT := REC.LEVEL;
+ end loop;
+ /* Возвращаем результат */
+ return NRESULT;
+ end PRODPLAN_MAX_LEVEL_GET;
+
+ /* Определение дат спецификации плана */
+ procedure FCPRODPLANSP_DATES_GET
+ (
+ DREP_DATE in date, -- Дата запуска спецификации
+ DREP_DATE_TO in date, -- Дата выпуска спецификации
+ DINCL_DATE in date, -- Дата включения в план спецификации
+ DDATE_FROM out date, -- Итоговая дата запуска спецификации
+ DDATE_TO out date -- Итоговая дата выпуска спецификации
+ )
+ is
+ begin
+ /* Если даты запуска и выпуска пусты */
+ 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;
+ end FCPRODPLANSP_DATES_GET;
+
/* Инициализация динамических атрибутов */
procedure TASK_ATTRS_INIT
(
- RG in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
+ RG in out nocopy PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
)
is
begin
@@ -1739,41 +2184,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
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,
- STEXT_COLOR => STEXT_COLOR_GREY,
- SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.');
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
- SBG_COLOR => SBG_COLOR_GREEN,
- SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW,
- STEXT_COLOR => STEXT_COLOR_GREY,
- SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. ');
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
- SBG_COLOR => SBG_COLOR_BLACK,
- STEXT_COLOR => STEXT_COLOR_ORANGE,
- SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
- SBG_COLOR => SBG_COLOR_GREY,
- SDESC => 'Для спецификаций планов и отчетов производства изделий не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» больше текущей.');
- end TASK_COLORS_INIT;
-
/* Заполнение значений динамических атрибутов */
- procedure FILL_TASK_ATTRS
+ procedure TASK_ATTRS_FILL
(
RG in PKG_P8PANELS_VISUAL.TGANTT, -- Описание диаграммы Ганта
RGT in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы
@@ -1781,7 +2193,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NMAIN_QUANT in number, -- Выпуск
NREL_FACT in number, -- Выпуск факт
DREP_DATE_TO in date, -- Дата выпуска
- NTYPE in number, -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
+ NTYPE in number, -- Тип (см. константы NTASK_TYPE_*)
SDETAIL_LIST in varchar2, -- Ссылки на детализацию
SMEAS in varchar2 -- Единица измерения
)
@@ -1817,38 +2229,123 @@ create or replace package body PKG_P8PANELS_MECHREC as
RTASK => RGT,
SNAME => STASK_ATTR_MEAS,
SVALUE => SMEAS);
- end FILL_TASK_ATTRS;
-
- /* Получение типа задачи */
- procedure GET_TASK_TYPE
+ end TASK_ATTRS_FILL;
+
+ /* Инициализация цветов */
+ procedure TASK_COLORS_INIT
(
- NCOMPANY in number, -- Рег. номер организации
- SSORT_FIELD in varchar2, -- Тип сортировки
- NFCPRODPLAN in number, -- Рег. номер плана
- NFCPRODPLANSP in number, -- Рег. номер спецификации плана
- STASK_BG_COLOR in varchar2, -- Цвет заливки задачи
- STASK_BG_PROGRESS_COLOR in varchar2, -- Цвет заливки прогресса
- NTYPE out number, -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
- SDETAIL_LIST out varchar2 -- Ссылки на детализацию
+ RG in out nocopy 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,
+ STEXT_COLOR => STEXT_COLOR_GREY,
+ SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
+ SBG_COLOR => SBG_COLOR_GREEN,
+ SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW,
+ STEXT_COLOR => STEXT_COLOR_GREY,
+ SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. ');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
+ SBG_COLOR => SBG_COLOR_BLACK,
+ STEXT_COLOR => STEXT_COLOR_ORANGE,
+ SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
+ SBG_COLOR => SBG_COLOR_GREY,
+ SDESC => 'Для спецификаций планов и отчетов производства изделий не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» больше текущей.');
+ end TASK_COLORS_INIT;
+
+ /* Опеределение класса задачи */
+ function GET_TASK_CLASS
+ (
+ NDEFRESLIZ in number, -- Дефицит запуска
+ NREL_FACT in number, -- Выпуск факт
+ NDEFSTART in number, -- Дефицит выпуска
+ DREP_DATE in date, -- Дата запуска спецификации
+ DREP_DATE_TO in date, -- Дата выпуска спецификации
+ NHAVE_LINK in number := 0 -- Наличие связей с "Маршрутный лист" или "Приход из подразделения"
+ ) return number -- Класс задачи
+ is
+ NTASK_CLASS PKG_STD.TNUMBER; -- Класс задачи (см. константы NCLASS*)
+ begin
+ /* Если одна из дат не указана */
+ if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then
+ /* Если спецификация также не имеет связей */
+ if (NHAVE_LINK = 0) then
+ NTASK_CLASS := NCLASS_WO_LINKS;
+ end if;
+ else
+ /* Если нет связанных документов */
+ if (NHAVE_LINK = 0) then
+ /* Если дата запуска меньше текущей даты */
+ if (DREP_DATE <= sysdate) then
+ NTASK_CLASS := NCLASS_WITH_DEFICIT;
+ end if;
+ /* Если дата больше текущей даты */
+ if (DREP_DATE > sysdate) then
+ NTASK_CLASS := NCLASS_FUTURE_DATE;
+ end if;
+ end if;
+ end if;
+ /* Если класс не определен */
+ if (NTASK_CLASS is null) then
+ /* Если дефицит запуска <> 0 */
+ if (NDEFRESLIZ <> 0) then
+ /* Если дефицит выпуска = 0 */
+ if (NDEFSTART = 0) then
+ NTASK_CLASS := NCLASS_WO_DEFICIT;
+ else
+ NTASK_CLASS := NCLASS_WITH_DEFICIT;
+ end if;
+ else
+ /* Если дефицит выпуска = 0 */
+ if (NDEFSTART = 0) then
+ NTASK_CLASS := NCLASS_WO_DEFICIT;
+ else
+ /* Если дефицит запуска = 0 и выпуск факт = 0 */
+ if ((NDEFRESLIZ = 0) and (NREL_FACT = 0)) then
+ NTASK_CLASS := NCLASS_FULL_DEFICIT;
+ end if;
+ /* Если дефицит запуска = 0 и выпуск факт <> 0 */
+ if ((NDEFRESLIZ = 0) and (NREL_FACT <> 0)) then
+ NTASK_CLASS := NCLASS_PART_DEFICIT;
+ end if;
+ end if;
+ end if;
+ end if;
+ /* Возвращаем результат */
+ return NTASK_CLASS;
+ end GET_TASK_CLASS;
+
+ /* Получение типа задачи */
+ procedure GET_TASK_TYPE
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SSORT_FIELD in varchar2, -- Тип сортировки
+ NFCPRODPLAN in number, -- Рег. номер плана
+ NFCPRODPLANSP in number, -- Рег. номер спецификации плана
+ NTASK_CLASS in number, -- Класс задачи (см. константы NCLASS_*)
+ NTYPE out number, -- Тип задачи (см. константы NTASK_TYPE_*)
+ SDETAIL_LIST out varchar2 -- Ссылки на детализацию
)
is
begin
- /*
- Описание типов:
- 0 - Маршрутные листы с развертыванием товарных запасов
- 1 - Маршрутные листы с развертыванием комплектаций
- 2 - Приход из подразделений
- 3 - Приход из подразделений и маршрутные листы
- 4 - Маршрутные листы
- null - Нет детализации
- */
/* Исходим сортировка по "Дата запуска" */
if (SSORT_FIELD = 'DREP_DATE') then
- /* Если цвет - красный */
- if (STASK_BG_COLOR = SBG_COLOR_RED) then
+ /* Если класс "С дефицитом запуска или датой меньше текущей" */
+ if (NTASK_CLASS = NCLASS_WITH_DEFICIT) then
/* Проверяем деталь или изделие */
begin
- select 1
+ select NTASK_TYPE_RL_WITH_DL
into NTYPE
from DUAL
where exists (select null
@@ -1857,72 +2354,119 @@ create or replace package body PKG_P8PANELS_MECHREC as
and SP.UP_LEVEL = NFCPRODPLANSP);
exception
when others then
- NTYPE := 0;
+ NTYPE := NTASK_TYPE_RL_WITH_GP;
end;
/* Проверяем наличие связей с маршрутными листами */
if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 0) = 0) then
/* Указываем, что маршрутных листов нет */
SDETAIL_LIST := 'Нет маршрутных листов';
- NTYPE := null;
+ NTYPE := NTASK_TYPE_EMPTY;
else
/* Указываем, что маршрутные листы есть */
SDETAIL_LIST := 'Маршрутные листы';
end if;
else
/* Не отображаем информацию о маршрутных листах */
- NTYPE := null;
+ NTYPE := NTASK_TYPE_EMPTY;
SDETAIL_LIST := null;
end if;
else
- /* Если цвет зеленый */
- if (STASK_BG_COLOR = SBG_COLOR_GREEN) then
- /* Если полностью зеленый */
- if (STASK_BG_PROGRESS_COLOR is null) then
+ /* Исходим от класса */
+ case
+ /* Если класс "Без дефицита выпуска" */
+ when (NTASK_CLASS = NCLASS_WO_DEFICIT) then
/* Проверяем наличией связей с приходов из подразделений */
if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 2) = 0) then
/* Указываем, что приходов из подразделений нет */
SDETAIL_LIST := 'Нет приходов из подразделений';
- NTYPE := null;
+ NTYPE := NTASK_TYPE_EMPTY;
else
/* Указываем, что приходы из подразделений есть */
SDETAIL_LIST := 'Приход из подразделений';
- NTYPE := 2;
+ NTYPE := NTASK_TYPE_INC_DEPS;
end if;
- end if;
- /* Если желтно-зеленый */
- if (STASK_BG_PROGRESS_COLOR = SBG_COLOR_YELLOW) then
+ /* Если класс "С частичным дефицитом выпуска" */
+ when (NTASK_CLASS = NCLASS_PART_DEFICIT) then
/* Проверяем наличией связей с приходов из подразделений */
if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP) = 0) then
/* Указываем, что приходов из подразделений нет */
SDETAIL_LIST := 'Нет приходов из подразделений';
- NTYPE := null;
+ NTYPE := NTASK_TYPE_EMPTY;
else
/* Указываем, что приходы из подразделений есть */
SDETAIL_LIST := 'Приход из подразделений';
- NTYPE := 3;
+ NTYPE := NTASK_TYPE_INC_DEPS_RL;
end if;
- end if;
- else
- /* Если цвет полностью желтый или красный */
- if ((STASK_BG_COLOR = SBG_COLOR_YELLOW) or (STASK_BG_COLOR = SBG_COLOR_RED)) then
+ /* Если класс "С дефицитом запуска или датой меньше текущей" или "С полным дефицитом выпуска" */
+ when ((NTASK_CLASS = NCLASS_FULL_DEFICIT) or (NTASK_CLASS = NCLASS_WITH_DEFICIT)) then
/* Проверяем наличие связей с маршрутными листами */
if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 1) = 0) then
/* Указываем, что маршрутных листов нет */
SDETAIL_LIST := 'Нет маршрутных листов';
- NTYPE := null;
+ NTYPE := NTASK_TYPE_EMPTY;
else
/* Указываем, что маршрутные листы есть */
SDETAIL_LIST := 'Маршрутные листы';
- NTYPE := 4;
+ NTYPE := NTASK_TYPE_RL;
end if;
+ /* Класс не поддерживается */
else
- /* Для данных критериев ничего не выводится */
- NTYPE := null;
+ /* Для данных классов ничего не выводится */
+ NTYPE := NTASK_TYPE_EMPTY;
SDETAIL_LIST := null;
- end if;
- end if;
+ end case;
end if;
end GET_TASK_TYPE;
+
+ /* Формирование цветовых характеристик для задачи */
+ procedure GET_TASK_COLORS
+ (
+ NTASK_CLASS in number, -- Класс задачи (см. константы NCLASS_*)
+ STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации
+ STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации
+ STASK_TEXT_COLOR in out varchar2 -- Цвет текста
+ )
+ is
+ begin
+ /* Исходим от класса задачи */
+ case NTASK_CLASS
+ /* Без дефицита выпуска */
+ when NCLASS_WO_DEFICIT then
+ STASK_BG_COLOR := SBG_COLOR_GREEN;
+ STASK_TEXT_COLOR := STEXT_COLOR_GREY;
+ STASK_BG_PROGRESS_COLOR := null;
+ /* С частичным дефицитом выпуска */
+ when NCLASS_PART_DEFICIT then
+ STASK_BG_COLOR := SBG_COLOR_GREEN;
+ STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW;
+ STASK_TEXT_COLOR := STEXT_COLOR_GREY;
+ /* С полным дефицитом выпуска */
+ when NCLASS_FULL_DEFICIT then
+ STASK_BG_COLOR := SBG_COLOR_YELLOW;
+ STASK_TEXT_COLOR := null;
+ STASK_BG_PROGRESS_COLOR := null;
+ /* С дефицитом запуска или датой меньше текущей */
+ when NCLASS_WITH_DEFICIT then
+ STASK_BG_COLOR := SBG_COLOR_RED;
+ STASK_TEXT_COLOR := null;
+ STASK_BG_PROGRESS_COLOR := null;
+ /* Дата анализа еще не наступила */
+ when NCLASS_FUTURE_DATE then
+ STASK_BG_COLOR := SBG_COLOR_GREY;
+ STASK_TEXT_COLOR := null;
+ STASK_BG_PROGRESS_COLOR := null;
+ /* Задача без связи */
+ when NCLASS_WO_LINKS then
+ STASK_BG_COLOR := SBG_COLOR_BLACK;
+ STASK_TEXT_COLOR := STEXT_COLOR_ORANGE;
+ STASK_BG_PROGRESS_COLOR := null;
+ else
+ /* Не определено */
+ STASK_BG_COLOR := null;
+ STASK_TEXT_COLOR := null;
+ STASK_BG_PROGRESS_COLOR := null;
+ end case;
+ end GET_TASK_COLORS;
begin
/* Определяем заголовок плана */
FIND_ACATALOG_RN(NFLAG_SMART => 0,
@@ -1942,6 +2486,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
TASK_COLORS_INIT(RG => RG);
/* Определяем максимальный уровень иерархии */
NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN);
+ /* Определяем уровень фильтра */
+ NLEVEL_FILTER := COALESCE(NLEVEL, NMAX_LEVEL);
/* Обходим данные */
for C in (select TMP.*,
level NTASK_LEVEL
@@ -2010,7 +2556,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
and FM.RN = T.MATRES
and D.RN = FM.NOMENCLATURE
and D.UMEAS_MAIN = DM.RN) TMP
- where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL)))
+ where level <= NLEVEL_FILTER
connect by prior TMP.NRN = TMP.NUP_LEVEL
start with TMP.NUP_LEVEL is null
order siblings by TMP.DORDER_DATE asc)
@@ -2020,28 +2566,31 @@ create or replace package body PKG_P8PANELS_MECHREC as
SNOMEN_NAME => C.SNOMEN_NAME,
SSUBDIV_DLVR => C.SSUBDIV_DLVR,
NMAIN_QUANT => C.NMAIN_QUANT);
+ /* Определяем класс задачи */
+ NTASK_CLASS := GET_TASK_CLASS(NDEFRESLIZ => C.NDEFRESLIZ,
+ NREL_FACT => C.NREL_FACT,
+ NDEFSTART => C.NDEFSTART,
+ DREP_DATE => C.DREP_DATE,
+ DREP_DATE_TO => C.DREP_DATE_TO,
+ NHAVE_LINK => COALESCE(C.NHAVE_LINK, 0));
/* Инициализируем даты и цвет (если необходимо) */
- 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_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_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,
- NMAIN_QUANT => C.NMAIN_QUANT,
- STASK_BG_COLOR => STASK_BG_COLOR,
- STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
- STASK_TEXT_COLOR => STASK_TEXT_COLOR,
- NTASK_PROGRESS => NTASK_PROGRESS);
+ FCPRODPLANSP_DATES_GET(DREP_DATE => C.DREP_DATE,
+ DREP_DATE_TO => C.DREP_DATE_TO,
+ DINCL_DATE => C.DINCL_DATE,
+ DDATE_FROM => DDATE_FROM,
+ DDATE_TO => DDATE_TO);
+ /* Формирование характеристик элемента ганта */
+ GET_TASK_COLORS(NTASK_CLASS => NTASK_CLASS,
+ STASK_BG_COLOR => STASK_BG_COLOR,
+ STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
+ STASK_TEXT_COLOR => STASK_TEXT_COLOR);
+ /* Если класс задачи "С частичным дефицитом выпуска" */
+ if (NTASK_CLASS = NCLASS_PART_DEFICIT) then
+ /* Определяем пропорции прогресса */
+ NTASK_PROGRESS := ROUND(C.NREL_FACT / C.NMAIN_QUANT * 100);
+ else
+ /* Не требуется */
+ NTASK_PROGRESS := null;
end if;
/* Сформируем основную спецификацию */
RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => C.NRN,
@@ -2058,16 +2607,15 @@ create or replace package body PKG_P8PANELS_MECHREC as
BREAD_ONLY_DATES => true,
BREAD_ONLY_PROGRESS => true);
/* Определяем тип и ссылки на детализацию */
- GET_TASK_TYPE(NCOMPANY => NCOMPANY,
- SSORT_FIELD => SSORT_FIELD,
- NFCPRODPLAN => C.NPRN,
- NFCPRODPLANSP => C.NRN,
- STASK_BG_COLOR => STASK_BG_COLOR,
- STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
- NTYPE => NTYPE,
- SDETAIL_LIST => SDETAIL_LIST);
+ GET_TASK_TYPE(NCOMPANY => NCOMPANY,
+ SSORT_FIELD => SSORT_FIELD,
+ NFCPRODPLAN => C.NPRN,
+ NFCPRODPLANSP => C.NRN,
+ NTASK_CLASS => NTASK_CLASS,
+ NTYPE => NTYPE,
+ SDETAIL_LIST => SDETAIL_LIST);
/* Заполним значение динамических атрибутов */
- FILL_TASK_ATTRS(RG => RG,
+ TASK_ATTRS_FILL(RG => RG,
RGT => RGT,
NSTART_FACT => C.NSTART_FACT,
NMAIN_QUANT => C.NMAIN_QUANT,
@@ -2082,7 +2630,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
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))))
+ and NLEVEL_FILTER >= C.NTASK_LEVEL + 1)
loop
/* Добавляем зависимости */
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN);
@@ -2094,8 +2642,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG);
end FCPRODPLANSP_GET;
- /* Инициализация каталогов раздела "Планы и отчеты производства изделий" */
- procedure ACATALOG_INIT
+ /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Производственная программа" */
+ procedure FCPRODPLAN_PP_CTLG_INIT
(
COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
)
@@ -2114,6 +2662,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
where P.CRN = T.RN
and P.CATEGORY = NFCPRODPLAN_CATEGORY
and P.STATUS = NFCPRODPLAN_STATUS
+ and P.COMPANY = GET_SESSION_COMPANY()
and FS.RN = P.TYPE
and FS.CODE = SFCPRODPLAN_TYPE
and exists (select PSP.RN
@@ -2141,6 +2690,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
where T.DOCNAME = 'CostProductPlans'
and T.SIGNS = 1
and T.DOCNAME = UL.UNITCODE
+ and T.COMPANY = GET_SESSION_COMPANY()
and (UL.SHOW_INACCESS_CTLG = 1 or exists
(select null from V_USERPRIV UP where UP.CATALOG = T.RN) or exists
(select null
@@ -2172,7 +2722,3279 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
- end ACATALOG_INIT;
+ end FCPRODPLAN_PP_CTLG_INIT;
+
+ /*
+ Процедуры панели "Производственный план цеха"
+ */
+
+ /* Изменение приоритета партии маршрутного листа */
+ procedure FCROUTLST_PRIOR_PARTY_UPDATE
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SPRIOR_PARTY in varchar -- Новое значение приоритета партии
+ )
+ is
+ RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа
+ begin
+ /* Проверяем нет ли лишних символов */
+ if ((SPRIOR_PARTY is not null) and (REGEXP_COUNT(SPRIOR_PARTY, '[^0123456789]+') > 0)) then
+ P_EXCEPTION(0, 'Значение приоритета должно быть целым числом.');
+ end if;
+ /* Считываем запись маршрутного листа */
+ UTL_FCROUTLST_GET(NFCROUTLST => NFCROUTLST, RFCROUTLST => RFCROUTLST);
+ /* Исправляем приоритет партии */
+ RFCROUTLST.PRIOR_PARTY := TO_NUMBER(SPRIOR_PARTY);
+ /* Базовое исправление маршрутного листа */
+ P_FCROUTLST_BASE_UPDATE(NRN => RFCROUTLST.RN,
+ NCOMPANY => RFCROUTLST.COMPANY,
+ NDOCTYPE => RFCROUTLST.DOCTYPE,
+ SDOCPREF => RFCROUTLST.DOCPREF,
+ SDOCNUMB => RFCROUTLST.DOCNUMB,
+ DDOCDATE => RFCROUTLST.DOCDATE,
+ SBARCODE => RFCROUTLST.BARCODE,
+ NJUR_PERS => RFCROUTLST.JUR_PERS,
+ NSTATE => RFCROUTLST.STATE,
+ DCHANGE_DATE => RFCROUTLST.CHANGE_DATE,
+ NFACEACC => RFCROUTLST.FACEACC,
+ NPR_COND => RFCROUTLST.PR_COND,
+ NMATRES => RFCROUTLST.MATRES,
+ NNOMCLASSIF => RFCROUTLST.NOMCLASSIF,
+ NARTICLE => RFCROUTLST.ARTICLE,
+ NQUANT => RFCROUTLST.QUANT,
+ NMATRES_PLAN => RFCROUTLST.MATRES_PLAN,
+ NMEASURE_TYPE => RFCROUTLST.MEASURE_TYPE,
+ NQUANT_PLAN => RFCROUTLST.QUANT_PLAN,
+ NMATRES_FACT => RFCROUTLST.MATRES_FACT,
+ NQUANT_FACT => RFCROUTLST.QUANT_FACT,
+ DOUT_DATE => RFCROUTLST.OUT_DATE,
+ NBLANK => RFCROUTLST.BLANK,
+ NDETAILS_COUNT => RFCROUTLST.DETAILS_COUNT,
+ NSUPPLY => RFCROUTLST.SUPPLY,
+ NSTORAGE => RFCROUTLST.STORAGE,
+ NSTORAGE_IN => RFCROUTLST.STORAGE_IN,
+ NPRODCMP => RFCROUTLST.PRODCMP,
+ NPRODCMPSP => RFCROUTLST.PRODCMPSP,
+ DREL_DATE => RFCROUTLST.REL_DATE,
+ NREL_QUANT => RFCROUTLST.REL_QUANT,
+ NPRIOR_ORDER => RFCROUTLST.PRIOR_ORDER,
+ NPRIOR_PARTY => RFCROUTLST.PRIOR_PARTY,
+ NROUTSHT => RFCROUTLST.ROUTSHT,
+ NROUTE => RFCROUTLST.ROUTE,
+ NCALC_SCHEME => RFCROUTLST.CALC_SCHEME,
+ NPER_MATRES => RFCROUTLST.PER_MATRES,
+ NCOST_ARTICLE => RFCROUTLST.COST_ARTICLE,
+ NVALID_DOCTYPE => RFCROUTLST.VALID_DOCTYPE,
+ SVALID_DOCNUMB => RFCROUTLST.VALID_DOCNUMB,
+ DVALID_DOCDATE => RFCROUTLST.VALID_DOCDATE,
+ SNOTE => RFCROUTLST.NOTE,
+ NPARTY => RFCROUTLST.PARTY,
+ DEXEC_DATE => RFCROUTLST.EXEC_DATE,
+ SSEP_NUMB => RFCROUTLST.SEP_NUMB,
+ SINT_NUMB => RFCROUTLST.INT_NUMB);
+ end FCROUTLST_PRIOR_PARTY_UPDATE;
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана */
+ procedure FCROUTLST_DEPT_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ NFCMATRESOURCE PKG_STD.TREF; -- Рег. номер материального ресурса записи спецификации плана
+ NFCROUTLST PKG_STD.TREF; -- Рег. номер связанного маршрутного листа
+ NFCPRODPLANSP_MAIN PKG_STD.TREF; -- Рег. номер основного состава из "Производственная программа"
+ NFCROUTLSTORD_QUANT PKG_STD.TLNUMBER; -- Сумма "Количество" в спецификации "Заказы" маршрутного листа
+
+ /* Считывание материального ресурса спецификации плана */
+ function MATRES_RN_GET
+ (
+ NFCPRODPLANSP in number -- Рег. номер спецификации плана
+ ) return number -- Рег. номер материального ресурса
+ is
+ NRESULT PKG_STD.TREF; -- Рег. номер материального ресурса
+ begin
+ /* Считываем рег. номер материального ресурса */
+ begin
+ select T.MATRES into NRESULT from FCPRODPLANSP T where T.RN = NFCPRODPLANSP;
+ exception
+ when others then
+ P_EXCEPTION(0,
+ 'Ошибка считывания материального ресурса спецификации плана.');
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end MATRES_RN_GET;
+
+ /* Проверка прямой связи между МЛ и спецификацией плана "Заказы" */
+ function FCROUTLSTORD_QUANT_GET
+ (
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ ) return number -- Сумма "Количество" в спецификации "Заказы"
+ is
+ NRESULT PKG_STD.TLNUMBER; -- Сумма "Количество" в спецификации "Заказы"
+ begin
+ /* Считываем сумму "Количество" из спецификации "Заказы" */
+ begin
+ select COALESCE(sum(T.QUANT), 0) into NRESULT from FCROUTLSTORD T where T.PRN = NFCROUTLST;
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end FCROUTLSTORD_QUANT_GET;
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_INFO',
+ SCAPTION => 'Документ (тип, №, дата)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT',
+ SCAPTION => 'Количество план',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROCENT',
+ SCAPTION => 'Готовность партии',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPRIOR_PARTY',
+ SCAPTION => 'Приоритет партии',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPROD_ORDER',
+ SCAPTION => 'Заказ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ /*! Пока отключен */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NCHANGE_FACEACC',
+ SCAPTION => 'Изменить заказ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false,
+ BORDER => true);
+ /* Считываем рег. номер связанной спецификации из "Производственная программа" */
+ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP);
+ /* Если спецификация производственной программы найдена */
+ if (NFCPRODPLANSP_MAIN is not null) then
+ /* Считывание материального ресурса спецификации плана */
+ NFCMATRESOURCE := MATRES_RN_GET(NFCPRODPLANSP => NFCPRODPLANSP_MAIN);
+ /* Инициализируем список маршрутных листов */
+ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP_MAIN, NIDENT => NFCROUTLST_IDENT);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOC_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NPRIOR_PARTY,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SPROD_ORDER');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TRIM(T.DOCPREF) ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOCNUMB) ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TO_CHAR(T.DOCDATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT NQUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.LABOUR_FACT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN) NLABOUR_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.T_SHT_PLAN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN) NT_SHT_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.PRIOR_PARTY NPRIOR_PARTY,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select F.NUMB from FACEACC F where T.FACEACC = F.RN ) SPROD_ORDER');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.RN in (select SL.DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SELECTLIST SL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SL.IDENT = :NFCROUTLST_IDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SL.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MATRES = :NFCMATRESOURCE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DT.RN = T.DOCTYPE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())) P');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST_IDENT', NVALUE => NFCROUTLST_IDENT);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMATRESOURCE', NVALUE => NFCMATRESOURCE);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(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);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Читаем данные из курсора */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCROUTLST);
+ /* Добавляем колонку с рег. номером */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ /* Проверяем наличие прямой связи между МЛ и спецификацией плана */
+ if (PKG_DOCLINKS.FIND(NFLAG_SMART => 1,
+ SIN_UNITCODE => 'CostProductPlansSpecs',
+ NIN_DOCUMENT => NFCPRODPLANSP_MAIN,
+ NIN_PRN_DOCUMENT => null,
+ SOUT_UNITCODE => 'CostRouteLists',
+ NOUT_DOCUMENT => NFCROUTLST,
+ NOUT_PRN_DOCUMENT => null) = 1) then
+ /* Получаем сумму "Количество" из спецификации "Заказы" */
+ NFCROUTLSTORD_QUANT := FCROUTLSTORD_QUANT_GET(NFCROUTLST => NFCROUTLST);
+ /* Если сумма "Количество" в "Заказы" больше 0 */
+ if (NFCROUTLSTORD_QUANT > 0) then
+ /* Указываем её */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NFCROUTLSTORD_QUANT);
+ else
+ /* Берем из заголовка МЛ */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ end if;
+ else
+ /* Указываем 0 */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => 0);
+ end if;
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROCENT', ICURSOR => ICURSOR, NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPRIOR_PARTY',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPROD_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCHANGE_FACEACC', SVALUE => null);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end FCROUTLST_DEPT_DG_GET;
+
+ /* Получение таблицы строк маршрутного листа */
+ procedure FCROUTLSTSP_DEPT_DG_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NSTATE PKG_STD.TNUMBER; -- Состояние
+
+ /* Считывание текстового представления состояния строки маршрутного листа */
+ function FCROUTLSTSP_STATE_NAME_GET
+ (
+ NSTATE in number -- Состояние строки маршрутного листа
+ ) return varchar2 -- Наименование состояния строки маршрутного листа
+ is
+ SRESULT PKG_STD.TSTRING; -- Наименование состояния строки маршрутного листа
+ begin
+ /* Считываем наименование состояния по домену */
+ begin
+ select V.NAME
+ into SRESULT
+ from DMSDOMAINS T,
+ DMSENUMVALUES V
+ where T.CODE = SFCROUTLSTSP_STATE_DOMAIN
+ and V.PRN = T.RN
+ and V.VALUE_NUM = NSTATE;
+ exception
+ when others then
+ SRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return SRESULT;
+ end FCROUTLSTSP_STATE_NAME_GET;
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTATE',
+ SCAPTION => 'Состояние',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOPER_NUMB',
+ SCAPTION => 'Номер операции',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SROUTSHTSP_NAME',
+ SCAPTION => 'Операция',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSUBDIV',
+ SCAPTION => 'Цех, участок',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_PLAN',
+ SCAPTION => 'План',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_FACT',
+ SCAPTION => 'Факт',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NT_SHT_PLAN',
+ SCAPTION => 'Трудоемкость план',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLABOUR_FACT',
+ SCAPTION => 'Трудоемкость факт',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMUNIT',
+ SCAPTION => 'ЕИ трудоемкости',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.STATE NSTATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.OPER_NUMB SOPER_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(T.OPER_NUMB) || '', '' || ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(COALESCE(( select O.NAME from FCOPERTYPES O where T.OPER_TPS = O.RN ), T.OPER_UK)) SROUTSHTSP_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ( select I.CODE from INS_DEPARTMENT I where T.SUBDIV = I.RN ) SSUBDIV,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN NQUANT_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_FACT NQUANT_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.T_SHT_PLAN NT_SHT_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.LABOUR_FACT NLABOUR_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ( select D.MEAS_MNEMO from DICMUNTS D where T.MUNIT = D.RN ) SMUNIT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP T');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = :NFCROUTLST');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST', NVALUE => NFCROUTLST);
+ /* Описываем структуру записи курсора */
+ 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_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 10);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ /* Читаем состояние из курсора */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NSTATE);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'SSTATE',
+ SVALUE => FCROUTLSTSP_STATE_NAME_GET(NSTATE => NSTATE));
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOPER_NUMB',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SROUTSHTSP_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_PLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NT_SHT_PLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 8);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NLABOUR_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 9);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SMUNIT', ICURSOR => ICURSOR, NPOSITION => 10);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCROUTLSTSP_DEPT_DG_GET;
+
+ /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
+ procedure INCOMEFROMDEPS_DEPT_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCPRODPLANSP_MAIN PKG_STD.TREF; -- Рег. номер основного состава из "Производственная программа"
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTATE',
+ SCAPTION => 'Состояние',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_INFO',
+ SCAPTION => 'Документ (тип, №, дата)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_FACT',
+ SCAPTION => 'Количество сдано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DDUE_DATE',
+ SCAPTION => 'Дата сдачи',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Считываем рег. номер связанной спецификации из "Производственная программа" */
+ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP);
+ /* Если спецификация производственной программы найдена */
+ if (NFCPRODPLANSP_MAIN is not null) then
+ /* Инициализируем список маршрутных листов */
+ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP_MAIN, NIDENT => NFCROUTLST_IDENT);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SUBSTR(F_DOCSTATE_PLAN_FACT(T.DOC_STATE), 1, 20) SSTATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TRIM(T.DOC_PREF) ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOC_NUMB) ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TO_CHAR(T.DOC_DATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.QUANT_FACT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INCOMEFROMDEPSSPEC SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN) NQUANT_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.WORK_DATE as DDUE_DATE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INCOMEFROMDEPS T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where ((T.RN in (select L.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where L.IN_DOCUMENT = :NFCPRODPLANSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps') || '))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' or (T.RN in (select L.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SELECTLIST SL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SL.IDENT = :NFCROUTLST_IDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SL.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_DOCUMENT = SL.DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps') || ')))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOC_TYPE = DT.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP_MAIN);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST_IDENT', NVALUE => NFCROUTLST_IDENT);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SSTATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DDUE_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end INCOMEFROMDEPS_DEPT_DG_GET;
+
+ /* Получение таблицы спецификаций планов и отчетов производства изделий */
+ procedure FCPRODPLANSP_DEPT_DG_GET
+ (
+ NFCPRODPLAN in number, -- Рег. номер планов и отчетов производства изделий
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCPRODPLANSP PKG_STD.TREF; -- Рег. номер спецификации плана
+ DDATE PKG_STD.TLDATE := sysdate; -- Текущая дата
+ NSUM_PLAN PKG_STD.TLNUMBER; -- Сумма плана по строке
+ NSUM_FACT PKG_STD.TLNUMBER; -- Сумма факта по строке
+ DDATE_FROM PKG_STD.TLDATE; -- Дата начала месяца
+ DDATE_TO PKG_STD.TLDATE; -- Дата окончания месяца
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ NFCPRODPLANSP_MAIN PKG_STD.TREF; -- Рег. номер основного состава из "Производственная программа"
+ NMODIF PKG_STD.TREF; -- Рег. номер модификации
+
+ /* Считывание номенклатуры по спецификации плана */
+ function FCPRODPLANSP_MODIF_GET
+ (
+ NFCPRODPLANSP in number -- Рег. номер связанной спецификации плана
+ ) return number -- Рег. номер модификации номенклатуры
+ is
+ NRESULT PKG_STD.TREF; -- Рег. номер модификации номенклатуры
+ begin
+ /* Считываем рег. номер модификации спецификации плана */
+ begin
+ select F.NOMEN_MODIF
+ into NRESULT
+ from FCPRODPLANSP T,
+ FCMATRESOURCE F
+ where T.RN = NFCPRODPLANSP
+ and F.RN = T.MATRES;
+ exception
+ when others then
+ NRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end FCPRODPLANSP_MODIF_GET;
+
+ /* Инициализация дней месяца */
+ procedure INIT_DAYS
+ (
+ RDG in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы
+ DDATE_FROM in date, -- Дата начала месяца
+ DDATE_TO in date -- Дата окончания месяца
+ )
+ is
+ DDATE PKG_STD.TLDATE; -- Сформированная дата дня
+ NMONTH PKG_STD.TNUMBER; -- Текущий месяц
+ NYEAR PKG_STD.TNUMBER; -- Текущий год
+ SDATE_NAME PKG_STD.TSTRING; -- Строковое представление даты для наименования колонки
+ SPARENT_NAME PKG_STD.TSTRING; -- Наименование родительской строки
+ begin
+ /* Считываем месяц и год текущей даты */
+ NMONTH := D_MONTH(DDATE => sysdate);
+ NYEAR := D_YEAR(DDATE => sysdate);
+ /* Цикл по дням месяца */
+ for I in D_DAY(DDATE => DDATE_FROM) .. D_DAY(DDATE => DDATE_TO)
+ loop
+ /* Формируем дату дня */
+ DDATE := TO_DATE(TO_CHAR(I) || '.' || TO_CHAR(NMONTH) || '.' || TO_CHAR(NYEAR), 'dd.mm.yyyy');
+ /* Строковое представление даты для наименования колонки */
+ SDATE_NAME := TO_CHAR(DDATE, SCOL_PATTERN_DATE);
+ /* Формируем наименование родительской строки */
+ SPARENT_NAME := 'N_' || SDATE_NAME || '_PLAN_FACT';
+ /* Описываем родительскую колонку таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => SPARENT_NAME,
+ SCAPTION => LPAD(D_DAY(DDATE), 2, '0'),
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ SPARENT => 'NVALUE_BY_DAYS');
+ end loop;
+ end INIT_DAYS;
+
+ /* Расчет факта выпусков плана */
+ procedure FCPRODPLANSP_CALC
+ (
+ NFCPRODPLAN in number, -- Рег. номер планов и отчетов производства изделий
+ NCOMPANY in number -- Рег. номер организации
+ )
+ is
+ NIDENT PKG_STD.TREF; -- Идентификатор отмеченных записей
+ NTMP PKG_STD.TREF; -- Буфер
+ begin
+ /* Генерируем идентификатор отмеченных записей */
+ NIDENT := GEN_IDENT();
+ /* Цикл по записям спецификации плана */
+ for REC in (select T.RN from FCPRODPLANSP T where T.PRN = NFCPRODPLAN)
+ loop
+ /* Добавляем запись в отмеченные записи */
+ P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => REC.RN, SUNITCODE => 'CostProductPlansSpecs', NRN => NTMP);
+ end loop;
+ /* Расчет факта */
+ P_FCPRODPLANSP_BASE_CALC_FACT(NCOMPANY => NCOMPANY, NIDENT => NIDENT);
+ /* Очистка отмеченных записей */
+ P_SELECTLIST_CLEAR(NIDENT => NIDENT);
+ exception
+ when others then
+ /* Очистка отмеченных записей */
+ P_SELECTLIST_CLEAR(NIDENT => NIDENT);
+ end FCPRODPLANSP_CALC;
+ begin
+ /* Если это выбор плана */
+ if (NINCLUDE_DEF = 1) then
+ /* Расчет факта выпусков плана */
+ FCPRODPLANSP_CALC(NFCPRODPLAN => NFCPRODPLAN, NCOMPANY => NCOMPANY);
+ end if;
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 7);
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTATUS',
+ SCAPTION => 'Статус',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPROD_ORDER',
+ SCAPTION => 'Заказ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true,
+ SHINT => 'Содержит ссылку на связанные сдаточные накладные.',
+ NWIDTH => 100);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES_CODE',
+ SCAPTION => 'Обозначение',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true,
+ SHINT => 'Содержит ссылку на связанные маршрутные листы. ' ||
+ 'Цвет залики отражает следующие статусы: ' ||
+ 'Зеленый - "Факт" равен "План"; ' ||
+ 'Голубой - "План" меньше или равно "Факт" + "Запущено"; ' ||
+ 'Желтый - предыдущие условия не выполнены и на текущую дату сумма "Количество план" = 0 или меньше "План", то "Факт" больше или равно "План". ' ||
+ 'Иначе сумма "Количество факт" больше или равно сумме "Количество план"; ' ||
+ 'Красный - ни одно из предыдущих условий не выполнено. ',
+ NWIDTH => 120);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES_NAME',
+ SCAPTION => 'Наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true,
+ NWIDTH => 200);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSUBDIV',
+ SCAPTION => 'Цех-получатель',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true,
+ NWIDTH => 180);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NMAIN_QUANT',
+ SCAPTION => 'План',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NREL_FACT',
+ SCAPTION => 'Факт',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NFCROUTLST_QUANT',
+ SCAPTION => 'Запущено',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 90);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NVALUE_BY_DAYS',
+ SCAPTION => 'План/факт по дням',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ SHINT => 'Значения по спецификации "График сдачи": ' ||
+ 'Черный - значение "Количество план"; ' ||
+ 'Синий - значение "Количество факт". ' ||
+ 'Заливка серым определяет текущий день.');
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSUM_PLAN',
+ SCAPTION => 'Сумма "Количество план"',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSUM_FACT',
+ SCAPTION => 'Сумма "Количество факт"',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ /* Считываем первый и последний день месяца */
+ P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
+ /* Инициализация дней месяца */
+ INIT_DAYS(RDG => RDG, DDATE_FROM => DDATE_FROM, DDATE_TO => DDATE_TO);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select PORD.NUMB from FACEACC PORD where (PORD.RN = T.PROD_ORDER)) SPROD_ORDER,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MRES.CODE SMATRES_CODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MRES."NAME" SMATRES_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select INS_D.CODE from INS_DEPARTMENT INS_D where INS_D.RN = T.SUBDIV) SSUBDIV,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.MAIN_QUANT NMAIN_QUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_FACT NREL_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select COALESCE(sum(F.QUANT), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS DL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS L,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLST F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where DL.OUT_DOCUMENT = T.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_DOCUMENT = DL.IN_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and F.RN = L.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and F.STATE = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ') NFCROUTLST_QUANT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCPRODPLAN P,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCPRODPLANSP T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMATRESOURCE MRES');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.RN = :NFCPRODPLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PRN = P.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MAIN_QUANT <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MATRES = MRES.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlans'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlans'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLAN', NVALUE => NFCPRODPLAN);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Читаем данные из курсора */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCPRODPLANSP);
+ /* Добавляем колонку с рег. номером */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCPRODPLANSP, BCLEAR => true);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPROD_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES_CODE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NMAIN_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NREL_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NFCROUTLST_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 8);
+ /* Считываем рег. номер связанной спецификации из "Производственная программа" */
+ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP);
+ /* Если есть связанная спецификация из производственной программы */
+ if (NFCPRODPLANSP_MAIN is not null) then
+ /* Инициализируем список маршрутных листов */
+ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP_MAIN, NIDENT => NFCROUTLST_IDENT);
+ /* Считываем модификацию номенклатуры */
+ NMODIF := FCPRODPLANSP_MODIF_GET(NFCPRODPLANSP => NFCPRODPLANSP_MAIN);
+ end if;
+ /* Обнуляем сумму "Количество план" и "Количество факт" по строке */
+ NSUM_PLAN := 0;
+ NSUM_FACT := 0;
+ /* Добавляем значения по графику сдачи */
+ for REC in (select TMP.DOC_DATE,
+ COALESCE(sum(TMP.QUANT_PLAN), 0) QUANT_PLAN,
+ COALESCE(sum(TMP.QUANT_FACT), 0) QUANT_FACT
+ from ( /* Указаны в спецификации */
+ select T.DOC_DATE,
+ T.QUANT_PLAN,
+ 0 QUANT_FACT
+ from FCPRODPLANDLVSH T
+ where T.PRN = NFCPRODPLANSP
+ and T.DOC_DATE >= DDATE_FROM
+ and T.DOC_DATE <= DDATE_TO
+ union
+ /* Связаны со спецификацией плана или связанной строкой "Производственная программа" */
+ select D.WORK_DATE,
+ 0,
+ sum(S.QUANT_FACT)
+ from INCOMEFROMDEPS D,
+ INCOMEFROMDEPSSPEC S
+ where ( /* Связь по МЛ связанной строки "Производственная программа" */
+ (D.RN in (select DL.OUT_DOCUMENT
+ from SELECTLIST SL,
+ FCROUTLST FL,
+ DOCLINKS DL
+ where SL.IDENT = NFCROUTLST_IDENT
+ and SL.UNITCODE = 'CostRouteLists'
+ and FL.RN = SL.DOCUMENT
+ and FL.STATE = 1
+ and DL.IN_DOCUMENT = FL.RN
+ and DL.IN_UNITCODE = 'CostRouteLists'
+ and DL.OUT_UNITCODE = 'IncomFromDeps')) or
+ /* Прямая связь со связанной строкой "Производственная программа" */
+ (D.RN in (select L.OUT_DOCUMENT
+ from DOCLINKS L
+ where L.IN_DOCUMENT = NFCPRODPLANSP_MAIN
+ and L.IN_UNITCODE = 'CostProductPlansSpecs'
+ and L.OUT_UNITCODE = 'IncomFromDeps')) or
+ /* Прямая связь с обрабатываемой строкой */
+ (D.RN in (select L.OUT_DOCUMENT
+ from DOCLINKS L
+ where L.IN_DOCUMENT = NFCPRODPLANSP
+ and L.IN_UNITCODE = 'CostProductPlansSpecs'
+ and L.OUT_UNITCODE = 'IncomFromDeps')))
+ and D.DOC_STATE = NFCPRODPLAN_STATUS
+ and D.WORK_DATE >= DDATE_FROM
+ and D.WORK_DATE <= DDATE_TO
+ and S.PRN = D.RN
+ and S.NOMMODIF = NMODIF
+ group by D.WORK_DATE) TMP
+ group by TMP.DOC_DATE)
+ loop
+ /* Добавляем значение план/факт в соответствующую колонку */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'N_' || TO_CHAR(REC.DOC_DATE, SCOL_PATTERN_DATE) || '_PLAN_FACT',
+ SVALUE => TO_CHAR(REC.QUANT_PLAN) || '/' || TO_CHAR(REC.QUANT_FACT));
+ /* Если это ранее текущей даты */
+ if (REC.DOC_DATE <= DDATE) then
+ /* Добавляем к сумме по строке */
+ NSUM_PLAN := NSUM_PLAN + REC.QUANT_PLAN;
+ NSUM_FACT := NSUM_FACT + REC.QUANT_FACT;
+ end if;
+ end loop;
+ /* Добавляем колонки с суммами */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_PLAN', NVALUE => NSUM_PLAN);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_FACT', NVALUE => NSUM_FACT);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCPRODPLANSP_DEPT_DG_GET;
+
+ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
+ procedure FCPRODPLAN_DEPT_INIT
+ (
+ COUT out clob -- Список записей раздела "Планы и отчеты производства изделий"
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ DDATE_FROM PKG_STD.TLDATE; -- Дата с
+ DDATE_TO PKG_STD.TLDATE; -- Дата по
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Определяем период записей */
+ P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Цикл по планам и отчетам производства изделий */
+ for REC in (select P.RN NRN,
+ DT.DOCCODE || ', ' || trim(P.PREFIX) || '-' || trim(P.NUMB) || ', ' ||
+ TO_CHAR(P.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
+ D.CODE as SSUBDIV,
+ TO_CHAR(E.STARTDATE, 'mm.yyyy') as SPERIOD
+ from FCPRODPLAN P,
+ FINSTATE FS,
+ DOCTYPES DT,
+ INS_DEPARTMENT D,
+ ENPERIOD E
+ where P.CATEGORY = NFCPRODPLAN_DEPT_CTGR
+ and P.STATUS = NFCPRODPLAN_STATUS
+ and P.COMPANY = NCOMPANY
+ and P.SUBDIV in (select C.DEPTRN
+ from CLNPSPFM C,
+ CLNPSPFMTYPES CT
+ where exists (select null
+ from CLNPERSONS CP
+ where exists (select null
+ from AGNLIST T
+ where T.PERS_AUTHID = UTILIZER()
+ and CP.PERS_AGENT = T.RN
+ and T.VERSION = NVERSION)
+ and C.PERSRN = CP.RN
+ and CP.COMPANY = NCOMPANY)
+ and C.COMPANY = NCOMPANY
+ and C.BEGENG <= sysdate
+ and (C.ENDENG >= sysdate or C.ENDENG is null)
+ and C.CLNPSPFMTYPES = CT.RN
+ and CT.IS_PRIMARY = 1)
+ and FS.RN = P.TYPE
+ and FS.CODE = SFCPRODPLAN_TYPE
+ and D.RN = P.SUBDIV
+ and DT.RN = P.DOCTYPE
+ and E.RN = P.CALC_PERIOD
+ and E.STARTDATE >= DDATE_FROM
+ and E.ENDDATE <= DDATE_TO
+ 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())
+ order by SDOC_INFO)
+ 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.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
+ PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
+ /* Закрываем план */
+ 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 FCPRODPLAN_DEPT_INIT;
+
+ /*
+ Процедуры панели "Выдача сменного задания"
+ */
+
+ /* Добавление записи маршрутного листа в селектлисте */
+ procedure SELECTLIST_FCROUTLST_ADD
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ )
+ is
+ NRN PKG_STD.TSTRING; -- Рег. номер записи в селектлисте
+ begin
+ /* Считываем запись в селеклисте */
+ NRN := UTL_SELECTLIST_RN_GET(NIDENT => NIDENT,
+ NFCROUTLST => NFCROUTLST,
+ SUNITCODE => 'CostRouteLists',
+ SACTIONCODE => 'P8PanelsJobManage');
+ /* Если запись не найдена */
+ if (NRN is null) then
+ /* Добавляем запись в селектлист */
+ P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
+ NCOMPANY => null,
+ NDOCUMENT => NFCROUTLST,
+ SUNITCODE => 'CostRouteLists',
+ SACTIONCODE => 'P8PanelsJobManage',
+ NCRN => null,
+ NDOCUMENT1 => null,
+ SUNITCODE1 => null,
+ SACTIONCODE1 => null,
+ NRN => NRN);
+ end if;
+ end SELECTLIST_FCROUTLST_ADD;
+
+ /* Удаление записи маршрутного листа из селектлиста */
+ procedure SELECTLIST_FCROUTLST_DEL
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ )
+ is
+ NRN PKG_STD.TSTRING; -- Рег. номер записи в селектлисте
+ begin
+ /* Считываем запись в селеклисте */
+ NRN := UTL_SELECTLIST_RN_GET(NIDENT => NIDENT,
+ NFCROUTLST => NFCROUTLST,
+ SUNITCODE => 'CostRouteLists',
+ SACTIONCODE => 'P8PanelsJobManage');
+ /* Если запись найдена */
+ if (NRN is not null) then
+ /* Удаляем запись из селектлиста */
+ P_SELECTLIST_BASE_DELETE(NRN => NRN);
+ end if;
+ end SELECTLIST_FCROUTLST_DEL;
+
+ /* Выдать задание операции сменного задания */
+ procedure FCJOBSSP_ISSUE
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ begin
+ /* Если список операций не указан */
+ if (SFCJOBSSP_LIST is null) then
+ P_EXCEPTION(0, 'Список операций не определен.');
+ end if;
+ /* Цикл по операциям сменного задания */
+ for REC in (select T.*
+ from FCJOBSSP T
+ where T.PRN = NFCJOBS
+ and T.COMPANY = NCOMPANY
+ and T.RN in (select REGEXP_SUBSTR(SFCJOBSSP_LIST, '[^;]+', 1, level) NRN
+ from DUAL
+ connect by INSTR(SFCJOBSSP_LIST, ';', 1, level - 1) > 0)
+ and T.BEG_FACT is null)
+ loop
+ /* Исключаем оборудование */
+ P_FCJOBSSP_BASE_UPDATE(NRN => REC.RN,
+ NCOMPANY => REC.COMPANY,
+ SNUMB => REC.NUMB,
+ NTBOPERMODESP => REC.TBOPERMODESP,
+ SBARCODE => REC.BARCODE,
+ NFACEACC => REC.FACEACC,
+ NMATRES => REC.MATRES,
+ NNOMCLASSIF => REC.NOMCLASSIF,
+ NARTICLE => REC.ARTICLE,
+ NFCROUTSHTSP => REC.FCROUTSHTSP,
+ SOPER_NUMB => REC.OPER_NUMB,
+ NOPER_TPS => REC.OPER_TPS,
+ SOPER_UK => REC.OPER_UK,
+ NSIGN_CONTRL => REC.SIGN_CONTRL,
+ NMANPOWER => REC.MANPOWER,
+ NCATEGORY => REC.CATEGORY,
+ DBEG_PLAN => REC.BEG_PLAN,
+ DEND_PLAN => REC.END_PLAN,
+ DBEG_FACT => REC.BEG_FACT,
+ DEND_FACT => REC.END_FACT,
+ NQUANT_PLAN => REC.QUANT_PLAN,
+ NQUANT_FACT => REC.QUANT_FACT,
+ NNORM => REC.NORM,
+ NT_SHT_FACT => REC.T_SHT_FACT,
+ NT_PZ_PLAN => REC.T_PZ_PLAN,
+ NT_PZ_FACT => REC.T_PZ_FACT,
+ NT_VSP_PLAN => REC.T_VSP_PLAN,
+ NT_VSP_FACT => REC.T_VSP_FACT,
+ NT_O_PLAN => REC.T_O_PLAN,
+ NT_O_FACT => REC.T_O_FACT,
+ NNORM_TYPE => REC.NORM_TYPE,
+ NSIGN_P_R => REC.SIGN_P_R,
+ NLABOUR_PLAN => REC.LABOUR_PLAN,
+ NLABOUR_FACT => REC.LABOUR_FACT,
+ NCOST_PLAN => REC.COST_PLAN,
+ NCOST_FACT => REC.COST_FACT,
+ NCOST_FOR => REC.COST_FOR,
+ NCURNAMES => REC.CURNAMES,
+ NPERFORM_PLAN => REC.PERFORM_PLAN,
+ NPERFORM_FACT => REC.PERFORM_FACT,
+ NSTAFFGRP_PLAN => REC.STAFFGRP_PLAN,
+ NSTAFFGRP_FACT => REC.STAFFGRP_FACT,
+ NEQUIP_PLAN => REC.EQUIP_PLAN,
+ NEQUIP_FACT => REC.EQUIP_PLAN,
+ NLOSTTYPE => REC.LOSTTYPE,
+ NLOSTDEFL => REC.LOSTDEFL,
+ NFOREMAN => REC.FOREMAN,
+ NINSPECTOR => REC.INSPECTOR,
+ DOTK_DATE => REC.OTK_DATE,
+ NSUBDIV => REC.SUBDIV,
+ NEQCONFIG => REC.EQCONFIG,
+ SNOTE => REC.NOTE,
+ NMUNIT => REC.MUNIT);
+ end loop;
+ end FCJOBSSP_ISSUE;
+
+ /* Исключение оборудования из операции сменного задания */
+ procedure FCJOBSSP_EXC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ begin
+ /* Если оборудование выбрано */
+ if (NFCEQUIPMENT is not null) then
+ /* Проверяем наличие оборудования */
+ UTL_FCEQUIPMENT_EXISTS(NFCEQUIPMENT => NFCEQUIPMENT, NCOMPANY => NCOMPANY);
+ else
+ P_EXCEPTION(0, 'Оборудование не определено.');
+ end if;
+ /* Если список операций не указан */
+ if (SFCJOBSSP_LIST is null) then
+ P_EXCEPTION(0, 'Список операций не определен.');
+ end if;
+ /* Цикл по операциям сменного задания */
+ for REC in (select T.*
+ from FCJOBSSP T
+ where T.PRN = NFCJOBS
+ and T.COMPANY = NCOMPANY
+ and T.RN in (select REGEXP_SUBSTR(SFCJOBSSP_LIST, '[^;]+', 1, level) NRN
+ from DUAL
+ connect by INSTR(SFCJOBSSP_LIST, ';', 1, level - 1) > 0)
+ and T.EQUIP_PLAN = NFCEQUIPMENT)
+ loop
+ /* Если дата начала факт указана */
+ if (REC.BEG_FACT is not null) then
+ P_EXCEPTION(0, 'Операция "%s" исполняется.', REC.OPER_NUMB);
+ end if;
+ /* Исключаем оборудование */
+ P_FCJOBSSP_BASE_UPDATE(NRN => REC.RN,
+ NCOMPANY => REC.COMPANY,
+ SNUMB => REC.NUMB,
+ NTBOPERMODESP => REC.TBOPERMODESP,
+ SBARCODE => REC.BARCODE,
+ NFACEACC => REC.FACEACC,
+ NMATRES => REC.MATRES,
+ NNOMCLASSIF => REC.NOMCLASSIF,
+ NARTICLE => REC.ARTICLE,
+ NFCROUTSHTSP => REC.FCROUTSHTSP,
+ SOPER_NUMB => REC.OPER_NUMB,
+ NOPER_TPS => REC.OPER_TPS,
+ SOPER_UK => REC.OPER_UK,
+ NSIGN_CONTRL => REC.SIGN_CONTRL,
+ NMANPOWER => REC.MANPOWER,
+ NCATEGORY => REC.CATEGORY,
+ DBEG_PLAN => REC.BEG_PLAN,
+ DEND_PLAN => REC.END_PLAN,
+ DBEG_FACT => REC.BEG_FACT,
+ DEND_FACT => REC.END_FACT,
+ NQUANT_PLAN => REC.QUANT_PLAN,
+ NQUANT_FACT => REC.QUANT_FACT,
+ NNORM => REC.NORM,
+ NT_SHT_FACT => REC.T_SHT_FACT,
+ NT_PZ_PLAN => REC.T_PZ_PLAN,
+ NT_PZ_FACT => REC.T_PZ_FACT,
+ NT_VSP_PLAN => REC.T_VSP_PLAN,
+ NT_VSP_FACT => REC.T_VSP_FACT,
+ NT_O_PLAN => REC.T_O_PLAN,
+ NT_O_FACT => REC.T_O_FACT,
+ NNORM_TYPE => REC.NORM_TYPE,
+ NSIGN_P_R => REC.SIGN_P_R,
+ NLABOUR_PLAN => REC.LABOUR_PLAN,
+ NLABOUR_FACT => REC.LABOUR_FACT,
+ NCOST_PLAN => REC.COST_PLAN,
+ NCOST_FACT => REC.COST_FACT,
+ NCOST_FOR => REC.COST_FOR,
+ NCURNAMES => REC.CURNAMES,
+ NPERFORM_PLAN => REC.PERFORM_PLAN,
+ NPERFORM_FACT => REC.PERFORM_FACT,
+ NSTAFFGRP_PLAN => REC.STAFFGRP_PLAN,
+ NSTAFFGRP_FACT => REC.STAFFGRP_FACT,
+ NEQUIP_PLAN => null,
+ NEQUIP_FACT => REC.EQUIP_FACT,
+ NLOSTTYPE => REC.LOSTTYPE,
+ NLOSTDEFL => REC.LOSTDEFL,
+ NFOREMAN => REC.FOREMAN,
+ NINSPECTOR => REC.INSPECTOR,
+ DOTK_DATE => REC.OTK_DATE,
+ NSUBDIV => REC.SUBDIV,
+ NEQCONFIG => REC.EQCONFIG,
+ SNOTE => REC.NOTE,
+ NMUNIT => REC.MUNIT);
+ end loop;
+ end FCJOBSSP_EXC_FCEQUIPMENT;
+
+ /* Включение оборудование в строку сменного задания */
+ procedure FCJOBSSP_INC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ begin
+ /* Если оборудование выбрано */
+ if (NFCEQUIPMENT is not null) then
+ /* Проверяем наличие оборудования */
+ UTL_FCEQUIPMENT_EXISTS(NFCEQUIPMENT => NFCEQUIPMENT, NCOMPANY => NCOMPANY);
+ else
+ P_EXCEPTION(0, 'Оборудование не определено.');
+ end if;
+ /* Если список операций не указан */
+ if (SFCJOBSSP_LIST is null) then
+ P_EXCEPTION(0, 'Список операций не определен.');
+ end if;
+ /* Цикл по операциям сменного задания */
+ for REC in (select T.*
+ from FCJOBSSP T
+ where T.PRN = NFCJOBS
+ and T.COMPANY = NCOMPANY
+ and T.RN in (select REGEXP_SUBSTR(SFCJOBSSP_LIST, '[^;]+', 1, level) NRN
+ from DUAL
+ connect by INSTR(SFCJOBSSP_LIST, ';', 1, level - 1) > 0))
+ loop
+ /* Если дата начала факт указана */
+ if (REC.BEG_FACT is not null) then
+ P_EXCEPTION(0, 'Операция "%s" исполняется.', REC.OPER_NUMB);
+ end if;
+ /* Включаем в задание */
+ P_FCJOBSSP_BASE_UPDATE(NRN => REC.RN,
+ NCOMPANY => REC.COMPANY,
+ SNUMB => REC.NUMB,
+ NTBOPERMODESP => REC.TBOPERMODESP,
+ SBARCODE => REC.BARCODE,
+ NFACEACC => REC.FACEACC,
+ NMATRES => REC.MATRES,
+ NNOMCLASSIF => REC.NOMCLASSIF,
+ NARTICLE => REC.ARTICLE,
+ NFCROUTSHTSP => REC.FCROUTSHTSP,
+ SOPER_NUMB => REC.OPER_NUMB,
+ NOPER_TPS => REC.OPER_TPS,
+ SOPER_UK => REC.OPER_UK,
+ NSIGN_CONTRL => REC.SIGN_CONTRL,
+ NMANPOWER => REC.MANPOWER,
+ NCATEGORY => REC.CATEGORY,
+ DBEG_PLAN => REC.BEG_PLAN,
+ DEND_PLAN => REC.END_PLAN,
+ DBEG_FACT => REC.BEG_FACT,
+ DEND_FACT => REC.END_FACT,
+ NQUANT_PLAN => REC.QUANT_PLAN,
+ NQUANT_FACT => REC.QUANT_FACT,
+ NNORM => REC.NORM,
+ NT_SHT_FACT => REC.T_SHT_FACT,
+ NT_PZ_PLAN => REC.T_PZ_PLAN,
+ NT_PZ_FACT => REC.T_PZ_FACT,
+ NT_VSP_PLAN => REC.T_VSP_PLAN,
+ NT_VSP_FACT => REC.T_VSP_FACT,
+ NT_O_PLAN => REC.T_O_PLAN,
+ NT_O_FACT => REC.T_O_FACT,
+ NNORM_TYPE => REC.NORM_TYPE,
+ NSIGN_P_R => REC.SIGN_P_R,
+ NLABOUR_PLAN => REC.LABOUR_PLAN,
+ NLABOUR_FACT => REC.LABOUR_FACT,
+ NCOST_PLAN => REC.COST_PLAN,
+ NCOST_FACT => REC.COST_FACT,
+ NCOST_FOR => REC.COST_FOR,
+ NCURNAMES => REC.CURNAMES,
+ NPERFORM_PLAN => REC.PERFORM_PLAN,
+ NPERFORM_FACT => REC.PERFORM_FACT,
+ NSTAFFGRP_PLAN => REC.STAFFGRP_PLAN,
+ NSTAFFGRP_FACT => REC.STAFFGRP_FACT,
+ NEQUIP_PLAN => NFCEQUIPMENT,
+ NEQUIP_FACT => REC.EQUIP_FACT,
+ NLOSTTYPE => REC.LOSTTYPE,
+ NLOSTDEFL => REC.LOSTDEFL,
+ NFOREMAN => REC.FOREMAN,
+ NINSPECTOR => REC.INSPECTOR,
+ DOTK_DATE => REC.OTK_DATE,
+ NSUBDIV => REC.SUBDIV,
+ NEQCONFIG => REC.EQCONFIG,
+ SNOTE => REC.NOTE,
+ NMUNIT => REC.MUNIT);
+ end loop;
+ end FCJOBSSP_INC_FCEQUIPMENT;
+
+ /* Получение таблицы оборудования подразделения */
+ procedure FCEQUIPMENT_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSELECT',
+ SCAPTION => 'Выбран',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SCODE',
+ SCAPTION => 'Код',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SNAME',
+ SCAPTION => 'Наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLOADING',
+ SCAPTION => 'Загрузка',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NCOEFF',
+ SCAPTION => 'Норматив загрузки',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.CODE SCODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.NAME SNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(case');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when S.MUNIT is not null then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ROUND(F_DICMUNTS_BASE_RECALC_QUANT(' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ',');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NCOMPANY,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' S.MUNIT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' S.LABOUR_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F.TIME_MUNIT), 3)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCEQUIPMENT F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FCJOBSSP S on S.EQUIP_PLAN = F.RN and S.WORK_DATE is null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FCJOBS J on J.RN = S.PRN and F.SUBDIV = J.SUBDIV');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.RN = T.RN) NLOADING,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.COEFF NCOEFF');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCEQUIPMENT T');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.SUBDIV is not null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(T.COMPANY, T.SUBDIV, UTILIZER()) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ /*PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NVERSION', NVALUE => NVERSION);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE', DVALUE => sysdate);*/
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SCODE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SNAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NLOADING',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NCOEFF',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCEQUIPMENT_DG_GET;
+
+ /* Получение таблицы маршрутных листов спецификации сменного задания */
+ procedure FCJOBSSP_FCROUTLST_DG_GET
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSELECT',
+ SCAPTION => 'Выбран',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SFCROUTLST_INFO',
+ SCAPTION => 'Номер МЛ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES',
+ SCAPTION => 'Материальный ресурс',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPRIOR_ORDER',
+ SCAPTION => 'Приоритет',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select F.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PKG_DOCUMENT.MAKE_NUMBER(F.DOCTYPE, F.DOCPREF, F.DOCNUMB, F.DOCDATE) SFCROUTLST_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F2.CODE || '', '' || F2.NAME SMATRES,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F.PRIOR_ORDER NPRIOR_ORDER');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST F,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMATRESOURCE F2');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.RN in (select FL.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP JS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLST FL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLSTSP SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where JS.PRN = :NFCJOBS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JS.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SP.RN = (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(L I_DOCLINKS_OUT_DOCUMENT)') || ' MAX(L.IN_DOCUMENT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where L.OUT_DOCUMENT = JS.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteListsSpecs') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SP.STATE = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(SP.COMPANY, SP.SUBDIV, UTILIZER()) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FL.RN = SP.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = JS.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = JS.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobs') || ') ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' group by FL.RN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and F2.RN = F.MATRES');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCJOBS', NVALUE => NFCJOBS);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SFCROUTLST_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPRIOR_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCJOBSSP_FCROUTLST_DG_GET;
+
+ /* Получение спецификации сменного задания по отмеченным маршрутным листам */
+ procedure FCJOBSSP_DG_GET
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ NIDENT in number, -- Идентификатор процесса
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSELECT',
+ SCAPTION => 'Выбран',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOPER_NUMB',
+ SCAPTION => 'Номер операции',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOPER_NAME',
+ SCAPTION => 'Наименование операции',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NISSUED',
+ SCAPTION => 'Выдано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NISSUE',
+ SCAPTION => 'Выдать',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NEQUIP_PLAN',
+ SCAPTION => 'Рег. номер оборудования план',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false,
+ BORDER => true);
+ /* Если список выбраныых маршрутных листов не пустой */
+ if (NIDENT is not null) then
+ --if (SFCROUTLST_LIST is not null) then
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select TMP.NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.SOPER_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.SOPER_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.NISSUED,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.NQUANT_PLAN - TMP.NQUANT_FACT - TMP.NISSUED NISSUE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.NEQUIP_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(L I_DOCLINKS_OUT_DOCUMENT)') || ' T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.OPER_NUMB SOPER_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select coalesce(O.NAME, T.OPER_UK) from FCOPERTYPES O where T.OPER_TPS = O.RN) SOPER_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select sum(S.QUANT_PLAN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP S,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS DL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where S.PRN = T.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and S.WORK_DATE is null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_DOCUMENT = L.IN_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_DOCUMENT = S.RN) NISSUED,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN as NQUANT_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_FACT as NQUANT_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EQUIP_PLAN as NEQUIP_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = :NFCJOBS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_DOCUMENT in (select SL."DOCUMENT"');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SELECTLIST SL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SL.IDENT = :NIDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SL.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SL.ACTIONCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'P8PanelsJobManage') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RN = L.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists ( select null from V_USERPRIV UP where UP."CATALOG" = T.CRN )');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists ( select null from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobs') || ' )) TMP ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCJOBS', NVALUE => NFCJOBS);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOPER_NUMB',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOPER_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NISSUED',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NISSUE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NEQUIP_PLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCJOBSSP_DG_GET;
+
+ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
+ procedure FCJOBS_INIT
+ (
+ COUT out clob -- Список записей раздела "Сменные задания"
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ NPROCESS_IDENT PKG_STD.TREF; -- Идентификатор процесса
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Генерируем идентификатор процесса */
+ NPROCESS_IDENT := GEN_IDENT();
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Цикл по планам и отчетам производства изделий */
+ for REC in (select T.RN NRN,
+ DT.DOCCODE || ', ' || trim(T.DOCPREF) || '-' || trim(T.DOCNUMB) || ', ' ||
+ TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
+ INS.CODE SSUBDIV,
+ case
+ when PER.RN is not null then
+ TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') || ' ' || TN2S(PER.BEG_TIME) || ' - ' || TN2S(PER.END_TIME)
+ else
+ TO_CHAR(T.DOCDATE, 'dd.mm.yyyy')
+ end SPERIOD
+ from FCJOBS T,
+ DOCTYPES DT,
+ INS_DEPARTMENT INS,
+ TBOPERMODESP PER
+ where T.COMPANY = NCOMPANY
+ and T.STATE <> NFCJOBS_STATUS_WO
+ and DT.RN = T.DOCTYPE
+ and T.SUBDIV = INS.RN (+)
+ and T.TBOPERMODESP = PER.RN (+)
+ and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(T.COMPANY, T.SUBDIV, SUTILIZER) = 1
+ and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN)
+ and exists (select null from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = 'CostJobs')
+ order by SDOC_INFO)
+ loop
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
+ /* Описываем план */
+ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
+ PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => REC.SDOC_INFO);
+ PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
+ PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
+ /* Закрываем план */
+ PKG_XFAST.UP();
+ end loop;
+ /* Открываем дополнительную информацию */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XINFO');
+ /* Описываем идентификатор процесса */
+ PKG_XFAST.ATTR(SNAME => 'NPROCESS_IDENT', NVALUE => NPROCESS_IDENT);
+ /* Закрываем дополнительную информацию */
+ PKG_XFAST.UP();
+ /* Закрываем корень */
+ 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 FCJOBS_INIT;
+
+ /*
+ Процедуры панели "Загрузка цеха"
+ */
+
+ /* Получение загрузки цеха */
+ procedure FCJOBS_DEP_LOAD_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ DDATE_FROM PKG_STD.TLDATE; -- Дата начала месяца
+ DDATE_TO PKG_STD.TLDATE; -- Дата окончания месяца
+ DDATE PKG_STD.TLDATE; -- Дата для расчетов
+ NDICMUNTS_WD PKG_STD.TREF; -- Рег. номер единицы измерения нормочасов
+ NDICMUNTS_HOUR PKG_STD.TREF; -- Рег. номер единицы измерения часа
+ NFCEQUIPMENT PKG_STD.TREF; -- Рег. номер оборудования
+ TDAYS TJOB_DAYS; -- Коллекция дней месяца
+ NINDEX PKG_STD.TNUMBER; -- Индекс даты в коллекции дат
+
+ /* Считывание индекса коллекции дней */
+ function TDAYS_INDEX_GET
+ (
+ TDAYS in TJOB_DAYS, -- Коллекция дней
+ DDATE in date -- Дата дня
+ ) return number -- Индекс дня в коллекции
+ is
+ begin
+ /* Цикл по дням месяца */
+ for I in TDAYS.FIRST..TDAYS.LAST
+ loop
+ /* Если это искомый день */
+ if (TDAYS(I).DDATE = TRUNC(DDATE)) then
+ /* Возвращаем индекс */
+ return I;
+ end if;
+ end loop;
+ /* Возвращаем null */
+ return null;
+ end TDAYS_INDEX_GET;
+
+ /* Инициализация дней месяца */
+ procedure DAYS_INIT
+ (
+ RDG in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы
+ TJOB_DAYS in out nocopy TJOB_DAYS, -- Коллекция дней месяца
+ DDATE_FROM in date, -- Дата начала месяца
+ DDATE_TO in date -- Дата окончания месяца
+ )
+ is
+ DDATE PKG_STD.TLDATE; -- Сформированная дата дня
+ NMONTH PKG_STD.TNUMBER; -- Текущий месяц
+ NYEAR PKG_STD.TNUMBER; -- Текущий год
+ SDATE_NAME PKG_STD.TSTRING; -- Строковое представление даты для наименования колонки
+ begin
+ /* Считываем месяц и год текущей даты */
+ NMONTH := D_MONTH(DDATE => sysdate);
+ NYEAR := D_YEAR(DDATE => sysdate);
+ /* Цикл по дням месяца */
+ for I in D_DAY(DDATE => DDATE_FROM) .. D_DAY(DDATE => DDATE_TO)
+ loop
+ /* Формируем дату дня */
+ DDATE := TO_DATE(TO_CHAR(I) || '.' || TO_CHAR(NMONTH) || '.' || TO_CHAR(NYEAR), 'dd.mm.yyyy');
+ /* Строковое представление даты для наименования колонки */
+ SDATE_NAME := TO_CHAR(DDATE, SCOL_PATTERN_DATE);
+ /* Описываем родительскую колонку таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'N_' || TO_CHAR(DDATE, SCOL_PATTERN_DATE) || '_VALUE',
+ SCAPTION => LPAD(D_DAY(DDATE), 2, '0'),
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ SPARENT => 'NVALUE_BY_DAYS');
+ /* Описываем родительскую колонку таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'N_' || TO_CHAR(DDATE, SCOL_PATTERN_DATE) || '_TYPE',
+ SCAPTION => LPAD(D_DAY(DDATE), 2, '0'),
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false,
+ SPARENT => 'NVALUE_BY_DAYS');
+ /* Добавляем день в коллекцию */
+ TJOB_DAYS_ADD(TDAYS => TJOB_DAYS, DDATE => DDATE, NVALUE => 0, NTYPE => null);
+ end loop;
+ end DAYS_INIT;
+
+ /* Заполнение нормы трудоемкости дней месяца */
+ procedure DAYS_FILL
+ (
+ TDAYS in out nocopy TJOB_DAYS, -- Коллекци дней месяца
+ DDATE in out date, -- Начальный день строки СЗ
+ DBEG_FACT in date, -- Дата начала факт
+ DDATE_TO in date, -- Дата окончания месяца
+ NLABOUR_FACT_FULL in number, -- Норма факт строки СЗ
+ NLABOUR_PLAN_FULL in number, -- Норма план строки СЗ (с учетом нормы факт)
+ NWORK_HOURS in number -- Количество рабочих часов смены
+ )
+ is
+ NHOURS_LEFT PKG_STD.TLNUMBER; -- Количество оставшихся часов в дне
+ NMAX_OF_DAY PKG_STD.TQUANT; -- Максимальное количество рабочих часов в дне
+ NLABOUR_FACT PKG_STD.TQUANT; -- Оставшаяся трудоемкость факт
+ NLABOUR_PLAN PKG_STD.TQUANT; -- Оставшаяся трудоемкость план
+ NLABOUR_BY_DAY PKG_STD.TQUANT; -- Суммарная трудоемкость за день (в доли смены)
+ NDAY_TYPE PKG_STD.TNUMBER; -- Тип дня (0 - выполняемый, 1 - выполненный)
+ NINDEX PKG_STD.TNUMBER; -- Индекс даты в коллекции дат
+ begin
+ /* Указываем изначальные план и факт */
+ NLABOUR_FACT := NLABOUR_FACT_FULL;
+ NLABOUR_PLAN := NLABOUR_PLAN_FULL;
+ /* Необходимо погасть факт и план */
+ while (((NLABOUR_FACT <> 0) or (NLABOUR_PLAN <> 0)) and (DDATE <= DDATE_TO))
+ loop
+ /* Обнуляем трудоемкость в доли смены за день */
+ NLABOUR_BY_DAY := 0;
+ /* Считываем индекс коллеции текущего дня */
+ NINDEX := TDAYS_INDEX_GET(TDAYS => TDAYS, DDATE => DDATE);
+ /* Изначально всегда "Выполнено" */
+ NDAY_TYPE := 1;
+ /* Определяем количество оставшихся часов в дне */
+ NHOURS_LEFT := (TRUNC(DDATE + 1) - DDATE) * 24;
+ /* Если в текущем дне еще есть время */
+ if (TDAYS(NINDEX).NVALUE <> 1) then
+ /* Если день пустой */
+ if (TDAYS(NINDEX).NVALUE = 0) then
+ /* Определяем возможное указание часов (относительно оставшегося времени дня или часов в смене) */
+ NMAX_OF_DAY := LEAST(NHOURS_LEFT, NWORK_HOURS);
+ else
+ /* Определяем количество оставшегося времени в дне */
+ NMAX_OF_DAY := ((1 - TDAYS(NINDEX).NVALUE) * NWORK_HOURS);
+ /* Определяем возможное указание часов (относительно оставшегося времени дня или заполненного времени дня) */
+ NMAX_OF_DAY := LEAST(NHOURS_LEFT, NMAX_OF_DAY);
+ end if;
+ /* Если указана дата начала факт и осталась трудоемкость факт */
+ if ((DBEG_FACT is not null) and (NLABOUR_FACT > 0)) then
+ /* Если в данный день невозможно отметить весь факт */
+ if (NLABOUR_FACT > NMAX_OF_DAY) then
+ /* Вычитаем из суммарного факта трудоемкость дня */
+ NLABOUR_FACT := NLABOUR_FACT - NMAX_OF_DAY;
+ NLABOUR_BY_DAY := NMAX_OF_DAY;
+ else
+ /* Добавляем трудоемкость факта и обнуляем суммарный факт */
+ NLABOUR_BY_DAY := NLABOUR_BY_DAY + NLABOUR_FACT;
+ NLABOUR_FACT := 0;
+ end if;
+ end if;
+ /* Если осталось время дня и есть план */
+ if ((NMAX_OF_DAY > NLABOUR_BY_DAY) and (NLABOUR_PLAN > 0)) then
+ /* Это день плана */
+ NDAY_TYPE := 0;
+ /* Если в данный день невозможно отметить всё */
+ if (NLABOUR_PLAN > (NMAX_OF_DAY - NLABOUR_BY_DAY)) then
+ /* Вычитаем из суммарного плана оставшуюсь часть дня */
+ NLABOUR_PLAN := NLABOUR_PLAN - (NMAX_OF_DAY - NLABOUR_BY_DAY);
+ NLABOUR_BY_DAY := NMAX_OF_DAY;
+ else
+ /* Добавляем трудоемкость плана и обнуляем суммарный план */
+ NLABOUR_BY_DAY := NLABOUR_BY_DAY + NLABOUR_PLAN;
+ NLABOUR_PLAN := 0;
+ end if;
+ end if;
+ /* Если рабочего времени не осталось */
+ if (NMAX_OF_DAY = 0) then
+ /* Указываем целый день */
+ TDAYS(NINDEX).NVALUE := 1;
+ else
+ /* Добавляем по текущему дню */
+ TDAYS(NINDEX).NVALUE := TDAYS(NINDEX).NVALUE + (NLABOUR_BY_DAY / NWORK_HOURS);
+ end if;
+ /* Указываем тип дня */
+ TDAYS(NINDEX).NTYPE := NDAY_TYPE;
+ end if;
+ /* Указываем следующий день */
+ DDATE := TRUNC(DDATE + 1);
+ end loop;
+ end DAYS_FILL;
+
+ /* Добавление информации в итоговый результат */
+ procedure ADD_INFO
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SUTILIZER in varchar2, -- Имя пользователя
+ COUT in out clob -- Сериализованная таблица данных
+ )
+ is
+ begin
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
+ /* Описываем план */
+ PKG_XFAST.VALUE_XML(LCVALUE => COUT);
+ /* Закрываем план */
+ PKG_XFAST.UP();
+ /* Открываем дополнительную информацию */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XINFO');
+ /* Описываем мнемокод подразделения */
+ PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => UTL_SUBDIV_CODE_GET(NCOMPANY => NCOMPANY, SUSER => SUTILIZER));
+ /* Закрываем дополнительную информацию */
+ PKG_XFAST.UP();
+ /* Закрываем корень */
+ 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;
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 5);
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SCODE',
+ SCAPTION => 'Мнемокод',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ NWIDTH => 100);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SNAME',
+ SCAPTION => 'Наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ NWIDTH => 200);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSUBDIV',
+ SCAPTION => 'Участок',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROCENT_LOAD',
+ SCAPTION => 'Загрузка (%)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLOAD',
+ SCAPTION => 'Загрузка (н/ч)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NVALUE_BY_DAYS',
+ SCAPTION => 'Загрузка по дням',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ /* Считываем первый и последний день месяца */
+ P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
+ /* Считываем единицу измерения нормочасов */
+ FIND_DICMUNTS_CODE(NFLAG_SMART => 0,
+ NFLAG_OPTION => 0,
+ NCOMPANY => NCOMPANY,
+ SMEAS_MNEMO => SDICMUNTS_WD,
+ NRN => NDICMUNTS_WD);
+ /* Считываем единицу измерения часа */
+ FIND_DICMUNTS_CODE(NFLAG_SMART => 0,
+ NFLAG_OPTION => 0,
+ NCOMPANY => NCOMPANY,
+ SMEAS_MNEMO => SDICMUNTS_HOUR,
+ NRN => NDICMUNTS_HOUR);
+ /* Инициализируем дни месяца */
+ DAYS_INIT(RDG => RDG, TJOB_DAYS => TDAYS, DDATE_FROM => DDATE_FROM, DDATE_TO => DDATE_TO);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select EQ.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.CODE SCODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.NAME SNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' I.CODE SSUBDIV,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ROUND(sum(case');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when JS.WORK_DATE is not null then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.LABOUR_FACT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end) / ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 60));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' / ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 160) || ', 3) NPROCENT_LOAD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ROUND(sum(case');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when JS.WORK_DATE is null then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F_DICMUNTS_BASE_RECALC_QUANT(0,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.COMPANY,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.MUNIT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JS.LABOUR_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end), 3) NLOAD');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBS T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCJOBSSP JS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCEQUIPMENT EQ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' INS_DEPARTMENT I');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOCDATE >= :DDATE_FROM');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOCDATE <= :DDATE_TO');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK(T.COMPANY, T.SUBDIV, UTILIZER()) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JS.PRN = T.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQ.RN = JS.EQUIP_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and I.RN = T.SUBDIV');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists ( select null from V_USERPRIV UP where UP."CATALOG" = T.CRN )');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' group by EQ.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.CODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' I.CODE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => DDATE_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => DDATE_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NDICMUNTS', NVALUE => NDICMUNTS_WD);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Считываем рег. номер оборудования */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCEQUIPMENT);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCEQUIPMENT, BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPROCENT_LOAD',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NLOAD', ICURSOR => ICURSOR, NPOSITION => 6);
+ /* Обходим загруженность по дням */
+ for REC in (select max(TMP.WORK_HOURS) NWORK_HOURS,
+ TMP.BEG_DATE DBEG_DATE,
+ SUM(TMP.LABOUR_PLAN) NLABOUR_PLAN,
+ SUM(TMP.LABOUR_FACT) NLABOUR_FACT
+ from (select BO.RN TBOPERMODESP,
+ case BO.SIGN_SHIFT
+ when 0 then
+ (BO.END_TIME - BO.BEG_TIME) * 24
+ else
+ (BO.END_TIME + 1 - BO.BEG_TIME) * 24
+ end WORK_HOURS,
+ TRUNC(COALESCE(T.BEG_FACT, T.BEG_PLAN)) BEG_DATE,
+ F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_PLAN, NDICMUNTS_HOUR) LABOUR_PLAN,
+ F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_FACT, NDICMUNTS_HOUR) LABOUR_FACT
+ from FCJOBSSP T,
+ FCJOBS J,
+ TBOPERMODESP BO
+ where T.COMPANY = NCOMPANY
+ and J.RN = T.PRN
+ and T.BEG_PLAN is not null
+ and T.BEG_PLAN <= DDATE_TO
+ and T.BEG_PLAN >= DDATE_FROM
+ and PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK(J.COMPANY, J.SUBDIV, SUTILIZER) = 1
+ and T.EQUIP_PLAN = NFCEQUIPMENT
+ and BO.RN = COALESCE(J.TBOPERMODESP, T.TBOPERMODESP)
+ order by T.BEG_FACT) TMP
+ group by TMP.BEG_DATE
+ order by TMP.BEG_DATE)
+ loop
+ /* Считываем индекс коллеции текущего дня */
+ NINDEX := TDAYS_INDEX_GET(TDAYS => TDAYS, DDATE => REC.DBEG_DATE);
+ /* Если факта меньше, чем плана */
+ if (REC.NLABOUR_FACT < REC.NLABOUR_PLAN) then
+ /* Тип дня - невыполненный */
+ TDAYS(NINDEX).NTYPE := 0;
+ else
+ /* Тип дня - невыполненный */
+ TDAYS(NINDEX).NTYPE := 1;
+ end if;
+ /* Если часов трудоемкости больше рабочего времени */
+ if (REC.NLABOUR_PLAN > REC.NWORK_HOURS) then
+ /* Указываем полную смену */
+ TDAYS(NINDEX).NVALUE := 1;
+ else
+ /* Указываем долю трудоемкости на смену */
+ TDAYS(NINDEX).NVALUE := REC.NLABOUR_PLAN / REC.NWORK_HOURS;
+ end if;
+ end loop;
+ /* Обходим все дни */
+ for I in TDAYS.FIRST .. TDAYS.LAST
+ loop
+ /* Отмечаем значение дня */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_VALUE',
+ NVALUE => ROUND(TDAYS(I).NVALUE, 3));
+ /* Отмечаем тип дня */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_TYPE',
+ NVALUE => TDAYS(I).NTYPE);
+ /* Обнуляем значения дня */
+ TDAYS(I).NVALUE := 0;
+ TDAYS(I).NTYPE := null;
+ end loop;
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ /* Добавление информации в итоговый результат */
+ ADD_INFO(NCOMPANY => NCOMPANY, SUTILIZER => SUTILIZER, COUT => COUT);
+ end FCJOBS_DEP_LOAD_DG_GET;
+
+ /*
+ Процедуры панели "Мониторинг сборки изделий"
+ */
+
+ /* Считывание рег. номера спецификации связанного плана */
+ function FCPRODPLANSP_LINKED_GET
+ (
+ NPRODCMPSP in number, -- Рег. номер производственного состава
+ NFCPRODPLAN in number -- Рег. номер план
+ ) return number -- Рег. номер спецификации связанного плана
+ is
+ NRESULT PKG_STD.TREF; -- Рег. номер спецификации связанного плана
+ begin
+ /* Считываем запись */
+ begin
+ select S.RN
+ into NRESULT
+ from FCPRODPLAN T,
+ FCPRODPLANSP S
+ where T.RN = (select P.RN
+ from DOCLINKS L,
+ FCPRODPLAN P
+ where L.IN_DOCUMENT = NFCPRODPLAN
+ and L.IN_UNITCODE = 'CostProductPlans'
+ and L.OUT_UNITCODE = 'CostProductPlans'
+ and P.RN = L.OUT_DOCUMENT
+ and P.CATEGORY = 1
+ and ROWNUM = 1)
+ and S.PRN = T.RN
+ and S.PRODCMPSP = NPRODCMPSP;
+ exception
+ when others then
+ NRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end FCPRODPLANSP_LINKED_GET;
+
+ /* Получение таблицы маршрутных листов, связанных с производственным составом */
+ procedure FCROUTLST_DG_BY_PRDCMPSP_GET
+ (
+ NPRODCMPSP in number, -- Рег. номер производственного состава
+ NFCPRODPLAN in number, -- Рег. номер план
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCPRODPLANSP PKG_STD.TREF; -- Рег. номер спецификации связанного плана
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ NDICMUNTS_WD PKG_STD.TREF; -- Рег. номер ед. измерения нормочасов
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SNUMB',
+ SCAPTION => '% п/п',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOPERATION',
+ SCAPTION => 'Содержание работ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SEXECUTOR',
+ SCAPTION => 'Исполнитель',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NREMN_LABOUR',
+ SCAPTION => 'Остаточная трудоемкость, в н/ч',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ /* Считываем рег. номер спецификации связанного плана */
+ NFCPRODPLANSP := FCPRODPLANSP_LINKED_GET(NPRODCMPSP => NPRODCMPSP, NFCPRODPLAN => NFCPRODPLAN);
+ /* Если спецификация считалась */
+ if (NFCPRODPLANSP is not null) then
+ /* Инициализируем список маршрутных листов */
+ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT);
+ /* Считываем единицу измерения нормочасов */
+ FIND_DICMUNTS_CODE(NFLAG_SMART => 0,
+ NFLAG_OPTION => 0,
+ NCOMPANY => NCOMPANY,
+ SMEAS_MNEMO => SDICMUNTS_WD,
+ NRN => NDICMUNTS_WD);
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select SF.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TRIM(SH.NUMB) SNUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' COALESCE(SH.OPER_UK, FT.NAME) SOPERATION,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select I.CODE from INS_DEPARTMENT I where SF.SUBDIV = I.RN) SEXECUTOR,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ROUND(F_DICMUNTS_BASE_RECALC_QUANT(' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ',');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NCOMPANY,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SF.MUNIT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SF.T_SHT_PLAN - SF.LABOUR_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS_WD), 3) NREMN_LABOUR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST F,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLSTSP SF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTSHTSP SH left outer join FCOPERTYPES FT on SH.OPER_TPS = FT.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.RN in (select SL."DOCUMENT"');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SELECTLIST SL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SL.IDENT = :NFCROUTLST_IDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SL.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SF.PRN = F.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SH.RN = SF.FCROUTSHTSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and F.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NDICMUNTS_WD', NVALUE => NDICMUNTS_WD);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST_IDENT', NVALUE => NFCROUTLST_IDENT);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SNUMB',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOPERATION',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SEXECUTOR',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NREMN_LABOUR',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ end if;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end FCROUTLST_DG_BY_PRDCMPSP_GET;
+
+ /* Получение таблицы комплектовочных ведомостей, связанных с производственным составом */
+ procedure FCDELIVSH_DG_BY_PRDCMPSP_GET
+ (
+ NPRODCMPSP in number, -- Рег. номер производственного состава
+ NFCPRODPLAN in number, -- Рег. номер план
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCPRODPLANSP PKG_STD.TREF; -- Рег. номер спецификации связанного плана
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSUBDIV',
+ SCAPTION => 'Цех',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SNOMEN',
+ SCAPTION => 'Номенклатура',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_PROD',
+ SCAPTION => 'Применяемость на одно ВС',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPROVIDER',
+ SCAPTION => 'Поставщик',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NDEFICIT',
+ SCAPTION => 'Дефицит',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ /* Считываем рег. номер спецификации связанного плана */
+ NFCPRODPLANSP := FCPRODPLANSP_LINKED_GET(NPRODCMPSP => NPRODCMPSP, NFCPRODPLAN => NFCPRODPLAN);
+ /* Если спецификация считалась */
+ if (NFCPRODPLANSP is not null) then
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select I.CODE from INS_DEPARTMENT I where T.SUBDIV = I.RN) SSUBDIV,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' NM.NOMEN_NAME SNOMEN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PROD NQUANT_PROD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select I2.CODE from INS_DEPARTMENT I2 where T.PR_SUBDIV = I2.RN) SPROVIDER,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DEFICIT NDEFICIT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS D,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCDELIVSHSP T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMATRESOURCE F,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DICNOMNS NM');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where D.IN_DOCUMENT = :NFCPRODPLANSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and D.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and D.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostDeliverySheets'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PRN = D.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MATRES = F.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and F.NOMENCLATURE = NM.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SSUBDIV',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SNOMEN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_PROD',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPROVIDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NDEFICIT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCDELIVSH_DG_BY_PRDCMPSP_GET;
+
+ /* Получение изображения для записи "Планы и отчеты производства изделий" */
+ function FCPRODPLAN_IMAGE_GET
+ (
+ NRN in number, -- Рег. номер записи плана производства изделий
+ SFLINKTYPE in varchar2 -- Код типа присоединённого документа изображения (см. константы SFLINKTYPE_*)
+ ) return blob -- Данные считанного изображения (null - если ничего не найдено)
+ is
+ begin
+ /* Найдем изображение */
+ for IMG in (select M.BDATA
+ from FILELINKS M,
+ FILELINKSUNITS U,
+ FLINKTYPES FLT
+ where M.FILE_TYPE = FLT.RN
+ and FLT.CODE = SFLINKTYPE
+ and U.TABLE_PRN = NRN
+ and U.UNITCODE = 'CostProductPlans'
+ and M.RN = U.FILELINKS_PRN
+ and M.BDATA is not null
+ and ROWNUM = 1)
+ loop
+ /* Вернём его */
+ return IMG.BDATA;
+ end loop;
+ /* Ничего не нашли */
+ return null;
+ end FCPRODPLAN_IMAGE_GET;
+
+ /* Получение таблицы записей "Планы и отчеты производства изделий" */
+ procedure FCPRODPLAN_GET
+ (
+ NCRN in number, -- Рег. номер каталога
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NPROGRESS PKG_STD.TLNUMBER; -- Прогресс плана
+
+ /* Получение номера плана из примечания */
+ function NUMB_BY_NOTE_GET
+ (
+ SNOTE in varchar2 -- Примечание
+ ) return varchar2 -- Номер плана
+ is
+ begin
+ /* Возвращаем результат */
+ return trim(SUBSTR(SNOTE, INSTR(SNOTE, '№') + 1, LENGTH(SNOTE)));
+ end NUMB_BY_NOTE_GET;
+
+ /* Получение детализации по прогрессу */
+ function DETAIL_BY_PROGRESS_GET
+ (
+ NPROGRESS in number -- Прогресс
+ ) return varchar2 -- Детализация по прогрессу
+ is
+ SRESULT PKG_STD.TSTRING; -- Детализация по прогрессу
+ begin
+ /* Определяем детализацию по прогрессу */
+ case
+ when (NPROGRESS >= 70) then
+ SRESULT := 'Основная сборка: Стыковка агрегатов выполнена';
+ when (NPROGRESS >= 40) then
+ SRESULT := 'Изготовление агрегатов: Фюзеляж и ОЧК не переданы в цех ОС';
+ when (NPROGRESS >= 10) then
+ SRESULT := 'Изготовление ДСЕ: Фюзеляж и ОЧК не укомлектованы ДСЕ';
+ else
+ SRESULT := 'Изготовление ДСЕ не начато';
+ end case;
+ /* Возвращаем результат */
+ return SRESULT;
+ end DETAIL_BY_PROGRESS_GET;
+ begin
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Цикл по планам и отчетам производства изделий */
+ for REC in (select P.RN NRN,
+ P.NOTE SNOTE,
+ D_YEAR(EN.STARTDATE) NYEAR,
+ COALESCE(sum(SP.LABOUR_FACT), 0) NLABOUR_FACT,
+ COALESCE(sum(SP.LABOUR_PLAN), 0) NLABOUR_PLAN
+ from FCPRODPLAN P
+ left outer join FCPRODPLANSP SP
+ on P.RN = SP.PRN
+ and ((SP.LABOUR_PLAN is not null) or (SP.LABOUR_FACT is not null)), FINSTATE FS, ENPERIOD EN
+ where P.CRN = NCRN
+ and P.CATEGORY = NFCPRODPLAN_CATEGORY_MON
+ and P.STATUS = NFCPRODPLAN_STATUS_MON
+ and FS.RN = P.TYPE
+ and FS.CODE = SFCPRODPLAN_TYPE_MON
+ and EN.RN = P.CALC_PERIOD
+ 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())
+ group by P.RN,
+ P.NOTE,
+ EN.STARTDATE
+ order by EN.STARTDATE asc)
+ loop
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_INFO');
+ /* Описываем план */
+ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
+ PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => NUMB_BY_NOTE_GET(SNOTE => REC.SNOTE));
+ /* Определяем прогресс */
+ if (REC.NLABOUR_PLAN = 0) then
+ /* Не можем определить прогресс */
+ NPROGRESS := 0;
+ else
+ /* Если факта нет */
+ if (REC.NLABOUR_FACT = 0) then
+ /* Не можем определить прогресс */
+ NPROGRESS := 0;
+ else
+ /* Определим прогресс */
+ NPROGRESS := ROUND(REC.NLABOUR_FACT / REC.NLABOUR_PLAN * 100, 2);
+ end if;
+ end if;
+ PKG_XFAST.ATTR(SNAME => 'NPROGRESS', NVALUE => NPROGRESS);
+ PKG_XFAST.ATTR(SNAME => 'SDETAIL', SVALUE => DETAIL_BY_PROGRESS_GET(NPROGRESS => NPROGRESS));
+ PKG_XFAST.ATTR(SNAME => 'NYEAR', NVALUE => REC.NYEAR);
+ PKG_XFAST.DOWN_NODE(SNAME => 'BIMAGE');
+ PKG_XFAST.VALUE(LBVALUE => FCPRODPLAN_IMAGE_GET(NRN => REC.NRN, SFLINKTYPE => SFLINKTYPE_PREVIEW));
+ PKG_XFAST.UP();
+ /* Закрываем план */
+ 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 FCPRODPLAN_GET;
+
+ /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Мониторинг сборки изделий" */
+ procedure FCPRODPLAN_AM_CTLG_INIT
+ (
+ COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
+ )
+ is
+ begin
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Цикл по планам и отчетам производства изделий */
+ for REC in (select TMP.NRN,
+ TMP.SNAME,
+ count(P.RN) NCOUNT_DOCS,
+ min(D_YEAR(ENP.STARTDATE)) NMIN_YEAR,
+ max(D_YEAR(ENP.ENDDATE)) NMAX_YEAR
+ from (select T.RN as NRN,
+ T.NAME as SNAME
+ from ACATALOG T,
+ UNITLIST UL
+ where T.DOCNAME = 'CostProductPlans'
+ and T.COMPANY = GET_SESSION_COMPANY()
+ 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) TMP
+ left outer join FCPRODPLAN P
+ on TMP.NRN = P.CRN
+ and P.CATEGORY = NFCPRODPLAN_CATEGORY_MON
+ and P.STATUS = NFCPRODPLAN_STATUS_MON
+ and P.COMPANY = GET_SESSION_COMPANY()
+ 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())
+ left outer join FINSTATE FS
+ on P.TYPE = FS.RN
+ and FS.CODE = SFCPRODPLAN_TYPE_MON
+ left join ENPERIOD ENP
+ on P.CALC_PERIOD = ENP.RN
+ group by TMP.NRN,
+ TMP.SNAME
+ order by TMP.SNAME asc)
+ loop
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_CRNS');
+ /* Описываем план */
+ 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.ATTR(SNAME => 'NMIN_YEAR', NVALUE => REC.NMIN_YEAR);
+ PKG_XFAST.ATTR(SNAME => 'NMAX_YEAR', NVALUE => REC.NMAX_YEAR);
+ /* Закрываем план */
+ 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 FCPRODPLAN_AM_CTLG_INIT;
+
+ /* Считывание деталей производственного состава */
+ procedure FCPRODCMP_DETAILS_GET
+ (
+ NFCPRODPLAN in number, -- Рег. номер плана
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ NDP_MODEL_ID PKG_STD.TREF; -- Рег. номер свойства "Идентификатор в SVG-модели"
+ NDP_MODEL_BG_COLOR PKG_STD.TREF; -- Рег. номер свойства "Цвет заливки в SVG-модели"
+ NFCPRODPLANSP PKG_STD.TREF; -- Рег. номер связанной спецификации плана
+ begin
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Считываем свойства детали для её позиционирования в модели */
+ FIND_DOCS_PROPS_CODE_EX(NFLAG_SMART => 1,
+ NCOMPVERS => NCOMPANY,
+ SUNITCODE => 'CostProductCompositionSpec',
+ SPROPCODE => SDP_MODEL_ID,
+ NRN => NDP_MODEL_ID);
+ FIND_DOCS_PROPS_CODE_EX(NFLAG_SMART => 1,
+ NCOMPVERS => NCOMPANY,
+ SUNITCODE => 'CostProductCompositionSpec',
+ SPROPCODE => SDP_MODEL_BG_COLOR,
+ NRN => NDP_MODEL_BG_COLOR);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Векторная модель */
+ PKG_XFAST.DOWN_NODE(SNAME => 'BMODEL');
+ PKG_XFAST.VALUE(LBVALUE => FCPRODPLAN_IMAGE_GET(NRN => NFCPRODPLAN, SFLINKTYPE => SFLINKTYPE_SVG_MODEL));
+ PKG_XFAST.UP();
+ /* Цикл по планам и отчетам производства изделий */
+ for REC in (select S.RN NRN,
+ (select F.NAME from FCMATRESOURCE F where F.RN = S.MTR_RES) SNAME,
+ PV_MID.STR_VALUE SMODEL_ID,
+ (select PV_MFC.STR_VALUE
+ from DOCS_PROPS_VALS PV_MFC
+ where PV_MFC.UNIT_RN = S.RN
+ and PV_MFC.DOCS_PROP_RN = NDP_MODEL_BG_COLOR) SMODEL_BG_COLOR
+ from FCPRODPLANSP T,
+ FCPRODCMPSP S,
+ DOCS_PROPS_VALS PV_MID
+ where T.PRN = NFCPRODPLAN
+ and S.PRN = T.PRODCMP
+ and PV_MID.UNIT_RN = S.RN
+ and PV_MID.DOCS_PROP_RN = NDP_MODEL_ID)
+ loop
+ /* Получаем рег. номер связанной спецификации плана */
+ NFCPRODPLANSP := FCPRODPLANSP_LINKED_GET(NPRODCMPSP => REC.NRN, NFCPRODPLAN => NFCPRODPLAN);
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODCMP');
+ /* Описываем план */
+ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
+ PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME);
+ PKG_XFAST.ATTR(SNAME => 'SMODEL_ID', SVALUE => REC.SMODEL_ID);
+ PKG_XFAST.ATTR(SNAME => 'SMODEL_BG_COLOR', SVALUE => REC.SMODEL_BG_COLOR);
+ PKG_XFAST.ATTR(SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
+ /* Закрываем план */
+ 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 FCPRODCMP_DETAILS_GET;
end PKG_P8PANELS_MECHREC;
/
diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck
index 0e70042..960779a 100644
--- a/db/PKG_P8PANELS_PROJECTS.pck
+++ b/db/PKG_P8PANELS_PROJECTS.pck
@@ -365,9 +365,6 @@ create or replace package PKG_P8PANELS_PROJECTS as
NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
DDATE_FROM in date, -- Новая дата начала
DDATE_TO in date, -- Новая дата окончания
- DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
- DFACT in date, -- Факт по состоянию на
- NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли)
);
@@ -381,18 +378,7 @@ create or replace package PKG_P8PANELS_PROJECTS as
);
/* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */
- procedure JB_PERIODS_LIST_PLAN_FOT
- (
- NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
- NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
- NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
- CORDERS in clob, -- Сортировки
- NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
- COUT out clob -- Сериализованная таблица данных
- );
-
- /* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
- procedure JB_PERIODS_LIST_PLAN_JOBS
+ procedure JB_PERIODS_PLAN_FOT_LIST
(
NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
@@ -403,7 +389,18 @@ create or replace package PKG_P8PANELS_PROJECTS as
);
/* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */
- procedure JB_PERIODS_LIST_FACT_RPT
+ procedure JB_PERIODS_FACT_RPT_LIST
+ (
+ NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
+ procedure JB_PERIODS_PLAN_JOBS_LIST
(
NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
@@ -417,7 +414,6 @@ create or replace package PKG_P8PANELS_PROJECTS as
procedure JB_PERIODS_RECALC
(
NIDENT in number, -- Идентификатор процесса
- DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
NINITIAL in number, -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт)
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
);
@@ -449,58 +445,35 @@ create or replace package PKG_P8PANELS_PROJECTS as
/* Формирование исходных данных для балансировки планов-графиков работ */
procedure JB_INIT
(
- DBEGIN in out date, -- Дата начала периода мониторинга загрузки ресурсов
- DFACT in out date, -- Факт по состоянию на
- NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
- SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости
- NIDENT in out number, -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
- NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
+ DBEGIN in out date, -- Дата начала периода мониторинга загрузки ресурсов
+ DFACT in out date, -- Факт по состоянию на
+ NDURATION_MEAS out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ SDURATION_MEAS out varchar2, -- Единица измерения длительности (мнемокод)
+ NLAB_MEAS out number, -- Единица измерения трудоёмкости
+ SLAB_MEAS out varchar2, -- Единица измерения трудоёмкости (мнемокод)
+ NIDENT in out number, -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
+ NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
);
end PKG_P8PANELS_PROJECTS;
/
create or replace package body PKG_P8PANELS_PROJECTS as
-/*
-TODO: owner="root" created="25.10.2023"
-text="Пересчёт единиц измерения в мониторе плана-графика"
-*/
-
-/*
-TODO: owner="root" created="25.10.2023"
-text="Буфер для хранения параметров балансировки и читать их оттуда для вызовов JB_JOBS_MODIFY_PERIOD, JB_JOBS_PERIODS_RECALC"
-*/
-
-/*
-TODO: owner="root" created="25.10.2023"
-text="Права доступа в мониторе ресурвов при балансировке планов-графиков"
-*/
-
-/*
-TODO: owner="root" created="25.10.2023"
-text="Вынести расчте плановой трудоёмкости по графику (и всех её причендалов) в отдельную функцию (и), чтобы можно было включить её в динамический запрос и вернуть сортировку по полям трудоёмкости в JB_PERIODS_LIST_PLAN_JOBS"
-*/
-
-/*
-TODO: owner="root" created="25.10.2023"
-text="Проверить, что для расчётных полей дата-гридов отключена сортировка - иначе получается ошибка, т.к. поля нет в SQL-запросе"
-*/
-
-
/* Константы - предопределённые значения */
- SYES constant PKG_STD.TSTRING := 'Да'; -- Да
- NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков
- SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 Цена без НДС'; -- Мнемокод статьи калькуляции для учёта реализации
- SFPDARTCL_SELF_COST constant PKG_STD.TSTRING := '10 Себестоимость'; -- Мнемокод статьи калькуляции для учёта себестоимости
- NGANTT_TASK_CAPTION_LEN constant PKG_STD.TNUMBER := 50; -- Предельная длина (знаков) метки задачи при отображении диаграммы Ганта
- NJB_DURATION_MEAS constant PKG_STD.TNUMBER := 0; -- Единица измерения длительности по умолчанию для интерфейса балансировки работ (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
- SJB_LAB_MEAS constant PKG_STD.TSTRING := 'Ч/Ч'; -- Единица измерения трудоёмкости по умолчанию для интерфейса балансировки работ
+ SYES constant PKG_STD.TSTRING := 'Да'; -- Да
+ NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков
+ SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 Цена без НДС'; -- Мнемокод статьи калькуляции для учёта реализации
+ SFPDARTCL_SELF_COST constant PKG_STD.TSTRING := '10 Себестоимость'; -- Мнемокод статьи калькуляции для учёта себестоимости
+ NGANTT_TASK_CAPTION_LEN constant PKG_STD.TNUMBER := 50; -- Предельная длина (знаков) метки задачи при отображении диаграммы Ганта
+ NJB_DURATION_MEAS constant PKG_STD.TNUMBER := 0; -- Единица измерения длительности по умолчанию для интерфейса балансировки работ (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ SJB_LAB_MEAS constant PKG_STD.TSTRING := 'Ч/Ч'; -- Единица измерения трудоёмкости по умолчанию для интерфейса балансировки работ
+ SLAB_MEAS_HOURS constant PKG_STD.TSTRING := 'Ч/Ч'; -- Единица измерения трудоёмкости в человеко/часах
/* Константы - дополнительные свойства */
- SDP_SECON_RESP constant PKG_STD.TSTRING := 'ПУП.SECON_RESP'; -- Ответственный экономист проекта
- SDP_STAX_GROUP constant PKG_STD.TSTRING := 'ПУП.TAX_GROUP'; -- Налоговая группа проекта
- SDP_SCTL_COST constant PKG_STD.TSTRING := 'ПУП.CTL_COST'; -- Принзнак необходимости контроля факт. затрат по статье калькуляции
- SDP_SCTL_CONTR constant PKG_STD.TSTRING := 'ПУП.CTL_CONTR'; -- Принзнак необходимости контроля контрактации по статье калькуляции
+ SDP_SECON_RESP constant PKG_STD.TSTRING := 'ПУП.SECON_RESP'; -- Ответственный экономист проекта
+ SDP_STAX_GROUP constant PKG_STD.TSTRING := 'ПУП.TAX_GROUP'; -- Налоговая группа проекта
+ SDP_SCTL_COST constant PKG_STD.TSTRING := 'ПУП.CTL_COST'; -- Принзнак необходимости контроля факт. затрат по статье калькуляции
+ SDP_SCTL_CONTR constant PKG_STD.TSTRING := 'ПУП.CTL_CONTR'; -- Принзнак необходимости контроля контрактации по статье калькуляции
/* Считывание наименование подразделения по рег. номеру */
function UTL_INS_DEPARTMENT_GET_NAME
@@ -1066,7 +1039,7 @@ text="Проверить, что для расчётных полей дата-
begin
/* Читаем фильтры */
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
- /* Читем сортировки */
+ /* Читаем сортировки */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Преобразуем номер и размер страницы в номер строк с и по */
PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
@@ -1362,7 +1335,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.CURNAMES = CN.RN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = P.CRN)');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ')');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
@@ -1590,7 +1563,7 @@ text="Проверить, что для расчётных полей дата-
and PS.ENDPLAN is not null
and PS.HRN is null);
/* Инициализируем таблицу данных */
- RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
/* Если есть данные о начале и окончании проектов в портфеле */
if ((DFROM is not null) and (DTO is not null)) then
/* Формируем структуру заголовка */
@@ -1602,7 +1575,8 @@ text="Проверить, что для расчётных полей дата-
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SJOB',
SCAPTION => 'Работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ NWIDTH => 300);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SRESP',
SCAPTION => 'Ответственный',
@@ -2421,7 +2395,7 @@ text="Проверить, что для расчётных полей дата-
RSTG := STAGES_GET(NRN => NRN);
/* Вернём остаток дней */
if (RSTG.ENDPLAN is not null) then
- return RSTG.ENDPLAN - sysdate;
+ return ROUND(RSTG.ENDPLAN - sysdate);
else
return null;
end if;
@@ -2595,7 +2569,7 @@ text="Проверить, что для расчётных полей дата-
FIND_FPDARTCL_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SFPDARTCL_REALIZ, NRN => NFPDARTCL_REALIZ);
/* Читаем фильтры */
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
- /* Читем сортировки */
+ /* Читаем сортировки */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Преобразуем номер и размер страницы в номер строк с и по */
PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
@@ -3905,7 +3879,7 @@ text="Проверить, что для расчётных полей дата-
begin
/* Читаем фильтры */
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
- /* Читем сортировки */
+ /* Читаем сортировки */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Преобразуем номер и размер страницы в номер строк с и по */
PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
@@ -4359,6 +4333,85 @@ text="Проверить, что для расчётных полей дата-
return LAST_DAY(DRES);
end JB_GET_END;
+ /* Получение мнемокода единицы измерения длительности */
+ function JB_GET_DURATION_MEAS_CODE
+ (
+ NDURATION_MEAS in number -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ ) return varchar2 -- Мнемокод единицы измерения длительности
+ is
+ begin
+ /* Результат от указанного кода ЕИ длительности */
+ case NDURATION_MEAS
+ /* Известные ЕИ */
+ when 0 then
+ return 'День';
+ when 1 then
+ return 'Неделя';
+ when 2 then
+ return 'Декада';
+ when 3 then
+ return 'Месяц';
+ when 4 then
+ return 'Квартал';
+ when 5 then
+ return 'Год';
+ /* Неизвестная ЕИ */
+ else
+ P_EXCEPTION(0,
+ 'Единица измерения длительности "%s" не поддерживается.',
+ COALESCE(TO_CHAR(NDURATION_MEAS), '<НЕ УКАЗАНА>'));
+ end case;
+ end JB_GET_DURATION_MEAS_CODE;
+
+ /* Базовое добавление параметров балансировки */
+ procedure JB_PRMS_BASE_INSERT
+ (
+ NIDENT in number, -- Идентификатор процесса
+ DDATE_BEGIN in date, -- Дата начала периода балансировки
+ DDATE_FACT in date, -- Факт по состоянию на
+ NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ SDURATION_MEAS_CODE in varchar2, -- Единица измерения длительности (мнемокод)
+ NLAB_MEAS in number, -- Единица измерения трудоёмкости
+ SLAB_MEAS_CODE in varchar2, -- Единица измерения трудоёмкости (мнемокод)
+ NRN out number -- Рег. номер записи
+ )
+ is
+ begin
+ /* Сформируем рег. номер */
+ NRN := GEN_ID();
+ /* Добавим запись */
+ insert into P8PNL_JB_PRMS
+ (RN, IDENT, DATE_BEGIN, DATE_FACT, DURATION_MEAS, DURATION_MEAS_CODE, LAB_MEAS, LAB_MEAS_CODE)
+ values
+ (NRN, NIDENT, DDATE_BEGIN, DDATE_FACT, NDURATION_MEAS, SDURATION_MEAS_CODE, NLAB_MEAS, SLAB_MEAS_CODE);
+ end JB_PRMS_BASE_INSERT;
+
+ /* Очистка параметров балансировки */
+ procedure JB_PRMS_CLEAN
+ (
+ NIDENT in number -- Идентификатор процесса
+ )
+ is
+ begin
+ /* Удаляем периоды балансировки */
+ delete from P8PNL_JB_PRMS T where T.IDENT = NIDENT;
+ end JB_PRMS_CLEAN;
+
+ /* Считывание записи параметров балансировки работ */
+ function JB_PRMS_GET
+ (
+ NIDENT in number -- Идентификатор процесса
+ ) return P8PNL_JB_PRMS%rowtype -- Запись параметров
+ is
+ RRES P8PNL_JB_PRMS%rowtype; -- Буфер для результата
+ begin
+ select P.* into RRES from P8PNL_JB_PRMS P where P.IDENT = NIDENT;
+ return RRES;
+ exception
+ when NO_DATA_FOUND then
+ PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NIDENT, SUNIT_TABLE => 'P8PNL_JB_PRMS');
+ end JB_PRMS_GET;
+
/* Считывание записи проекта из буфера балансировки работ */
function JB_PRJCTS_GET
(
@@ -4543,24 +4596,25 @@ text="Проверить, что для расчётных полей дата-
(NJB_JOBS, NIDENT, NPRN, NHRN, NSOURCE, SNUMB, SNAME, DDATE_FROM, DDATE_TO, NDURATION, SEXECUTOR, NSTAGE, NEDITABLE);
end JB_JOBS_BASE_INSERT;
- /* Базовое изменением сроков работы в буфере балансировки */
+ /* Базовое изменение сроков работы в буфере балансировки */
procedure JB_JOBS_BASE_MODIFY_PERIOD
(
- NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
- NDELTA in number, -- Изменение срока работы
- NCHANGE_FLAG in number, -- Флаг изменения данных (1 - изменять дату начала, 2 - изменять дату окончания)
- DFACT in date, -- Факт по состоянию на
- NDURATION_MEAS in number -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
+ NDELTA in number, -- Изменение срока работы
+ NCHANGE_FLAG in number -- Флаг изменения данных (1 - изменять дату начала, 2 - изменять дату окончания)
)
is
- RJ PROJECTJOB%rowtype; -- Запись работы в проекте
- RS PROJECTSTAGE%rowtype; -- Запись этапа в проекте
- RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки
- DDATE_FROM_NEW PKG_STD.TLDATE; -- Новая дата начала работы
- DDATE_TO_NEW PKG_STD.TLDATE; -- Новая дата окончания работы
+ RJ PROJECTJOB%rowtype; -- Запись работы в проекте
+ RS PROJECTSTAGE%rowtype; -- Запись этапа в проекте
+ RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки
+ RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки
+ DDATE_FROM_NEW PKG_STD.TLDATE; -- Новая дата начала работы
+ DDATE_TO_NEW PKG_STD.TLDATE; -- Новая дата окончания работы
begin
/* Считаем работу из буфера */
RJB_J := JB_JOBS_GET(NJB_JOBS => NJB_JOBS);
+ /* Считаем параметры балансировки */
+ RJB_PRMS := JB_PRMS_GET(NIDENT => RJB_J.IDENT);
/* Считаем работу проекта */
RJ := JOBS_GET(NRN => RJB_J.SOURCE);
/* Проверки - работа должна быть привязана к этапу */
@@ -4589,27 +4643,27 @@ text="Проверить, что для расчётных полей дата-
P_PROJECTJOB_GET_OFFSET_DATE(NCOMPANY => RJ.COMPANY,
DSRC_DATE => DDATE_FROM_NEW,
NOFFSET => RJ.DURATION_P,
- NOFFSET_MEAS => NDURATION_MEAS,
+ NOFFSET_MEAS => RJB_PRMS.DURATION_MEAS,
DDEST_DATE => DDATE_TO_NEW);
else
DDATE_TO_NEW := RJB_J.DATE_TO + NDELTA;
P_PROJECTJOB_GET_OFFSET_DATE(NCOMPANY => RJ.COMPANY,
DSRC_DATE => DDATE_TO_NEW,
NOFFSET => -RJ.DURATION_P,
- NOFFSET_MEAS => NDURATION_MEAS,
+ NOFFSET_MEAS => RJB_PRMS.DURATION_MEAS,
DDEST_DATE => DDATE_FROM_NEW);
end if;
/* Проверки - дата начала работы не должна быть меньше даты факта */
- if ((NCHANGE_FLAG = 1) and (DDATE_FROM_NEW <= DFACT)) then
+ if ((NCHANGE_FLAG = 1) and (DDATE_FROM_NEW <= RJB_PRMS.DATE_FACT)) then
P_EXCEPTION(0,
'Работа не может начинаться раньше даты "Факт по состоянию на" (%s).',
- TO_CHAR(DFACT, 'DD.MM.YYYY'));
+ TO_CHAR(RJB_PRMS.DATE_FACT, 'DD.MM.YYYY'));
end if;
/* Проверки - дата окончания работы не должна быть меньше даты факта */
- if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW <= DFACT)) then
+ if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW <= RJB_PRMS.DATE_FACT)) then
P_EXCEPTION(0,
'Работа не может заканчиваться раньше даты "Факт по состоянию на" (%s).',
- TO_CHAR(DFACT, 'DD.MM.YYYY'));
+ TO_CHAR(RJB_PRMS.DATE_FACT, 'DD.MM.YYYY'));
end if;
/* Проверки - дата окончания работы не должна быть больше даты окончания этапа */
if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW >= RS.ENDPLAN)) then
@@ -4632,11 +4686,7 @@ text="Проверить, что для расчётных полей дата-
where PRV.IDENT = RJB_J.IDENT
and PRV.JB_JOBS = RJB_J.RN))
loop
- JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => C.RN,
- NDELTA => NDELTA,
- NCHANGE_FLAG => NCHANGE_FLAG,
- DFACT => DFACT,
- NDURATION_MEAS => NDURATION_MEAS);
+ JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => C.RN, NDELTA => NDELTA, NCHANGE_FLAG => NCHANGE_FLAG);
end loop;
end JB_JOBS_BASE_MODIFY_PERIOD;
@@ -4646,9 +4696,6 @@ text="Проверить, что для расчётных полей дата-
NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
DDATE_FROM in date, -- Новая дата начала
DDATE_TO in date, -- Новая дата окончания
- DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
- DFACT in date, -- Факт по состоянию на
- NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли)
)
is
@@ -4691,13 +4738,11 @@ text="Проверить, что для расчётных полей дата-
/* Изменяем работы */
JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => RJB_J.RN,
NDELTA => NDELTA,
- NCHANGE_FLAG => NCHANGE_FLAG,
- DFACT => DFACT,
- NDURATION_MEAS => NDURATION_MEAS);
+ NCHANGE_FLAG => NCHANGE_FLAG);
/* Выставим признак изменений в проекте */
JB_PRJCTS_SET_CHANGED(NJB_PRJCTS => RJB_P.RN, NCHANGED => 1);
/* Выполним пересчёт монитора */
- JB_PERIODS_RECALC(NIDENT => RJB_P.IDENT, DBEGIN => DBEGIN, NINITIAL => 0, NRESOURCE_STATUS => NRESOURCE_STATUS);
+ JB_PERIODS_RECALC(NIDENT => RJB_P.IDENT, NINITIAL => 0, NRESOURCE_STATUS => NRESOURCE_STATUS);
else
/* Ничего не изменили */
NRESOURCE_STATUS := -1;
@@ -4949,19 +4994,22 @@ text="Проверить, что для расчётных полей дата-
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NJB_PERIODS, SUNIT_TABLE => 'P8PNL_JB_PERIODS');
end JB_PERIODS_GET;
- /* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */
- procedure JB_PERIODS_LIST_PLAN_FOT
+ /* Формирование и расчет списка для детализации трудоёмкости по ФОТ периода балансировки */
+ procedure JB_PERIODS_PLAN_FOT_BUILD
(
NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
- NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
- NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
- CORDERS in clob, -- Сортировки
- NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
- COUT out clob -- Сериализованная таблица данных
+ NMODE in number := 0, -- Режим (0 - список для клиента, 1 - только расчёты)
+ NPAGE_NUMBER in number := 0, -- Номер страницы (игнорируется при NPAGE_SIZE=0 и NMODE = 1)
+ NPAGE_SIZE in number := 0, -- Количество записей на странице (0 - все, игнорируется при NMODE = 1)
+ CORDERS in clob := null, -- Сортировки (игнорируется при NMODE = 1)
+ NINCLUDE_DEF in number := 1, -- Признак включения описания колонок таблицы в ответ (игнорируется при NMODE = 1)
+ NLAB_PLAN_FOT out number, -- Плановая трудоёмкость согласно ФОТ
+ COUT out clob -- Сериализованная таблица данных (заполняется только при NMODE = 0)
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода
+ RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки
RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
@@ -4969,36 +5017,54 @@ text="Проверить, что для расчётных полей дата-
ICURSOR integer; -- Курсор для исполнения запроса
NROW_FROM PKG_STD.TREF; -- Номер строки с
NROW_TO PKG_STD.TREF; -- Номер строки по
+ NPERS_LAB PKG_STD.TLNUMBER; -- Трудоёмкость текущего сотрудника
+ NLAB_MEAS_HOURS PKG_STD.TREF; -- Рег. номер ЕИ трудоёмкости для человеко/часов
begin
+ /* Определим рег. номер ЕИ трудоёскости для человеко/часов */
+ FIND_DICMUNTS_BY_MNEMO(NFLAG_SMART => 0,
+ NCOMPANY => NCOMPANY,
+ SMEAS_MNEMO => SLAB_MEAS_HOURS,
+ NRN => NLAB_MEAS_HOURS);
+ /* Инициализируем сумму плановой трудоёмкости по ФОТ */
+ NLAB_PLAN_FOT := 0;
/* Считаем детализируемую запись периода */
RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS);
- /* Читем сортировки */
- RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
- /* Преобразуем номер и размер страницы в номер строк с и по */
- PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
- NPAGE_SIZE => NPAGE_SIZE,
- NROW_FROM => NROW_FROM,
- NROW_TO => NROW_TO);
- /* Инициализируем таблицу данных */
- RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
- /* Добавляем в таблицу описание колонок */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NRN',
- SCAPTION => 'Рег. номер исполнения должности',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SPERSON',
- SCAPTION => 'Сотрудник',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NLAB_PLAN_FOT',
- SCAPTION => 'Трудоёмкость',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false,
- BFILTER => false);
+ /* Считаем параметры балансировки */
+ RJB_PRMS := JB_PRMS_GET(NIDENT => RPRD.IDENT);
+ /* Если не формируем данные для клиента */
+ if (NMODE = 1) then
+ /* Преобразуем номер и размер страницы в номер строк с и по - нам нужны все записи */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => 0,
+ NPAGE_SIZE => 0,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ else
+ /* Будем строить курсор по параметрам - читаем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Добавляем в таблицу описание колонок */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер исполнения должности',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPERSON',
+ SCAPTION => 'Сотрудник',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLAB_PLAN_FOT',
+ SCAPTION => 'Трудоёмкость (' || RJB_PRMS.LAB_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BORDER => true);
+ end if;
/* Обходим данные */
begin
/* Добавляем подсказку совместимости */
@@ -5027,7 +5093,9 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.RN = FMH.PRN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((FMH.DO_ACT_FROM between :DDATE_FROM and :DDATE_TO) or (FMH.DO_ACT_TO between :DDATE_FROM and :DDATE_TO) or');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((FMH.DO_ACT_FROM < :DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, :DDATE_TO + 1) > :DDATE_TO)))');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_BASE.UTL_DOC_ACCESS_CHECK') ||'(FM.COMPANY, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'ClientPostPerform') || ', FM.RN) = 1');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
@@ -5054,19 +5122,31 @@ text="Проверить, что для расчётных полей дата-
/* Обходим выбранные записи */
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
- /* Добавляем колонки с данными */
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NRN',
- ICURSOR => ICURSOR,
- NPOSITION => 1,
- BCLEAR => true);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPERSON', ICURSOR => ICURSOR, NPOSITION => 2);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NLAB_PLAN_FOT',
- ICURSOR => ICURSOR,
- NPOSITION => 3);
- /* Добавляем строку в таблицу */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ /* Вычислим трудоёмкость по ФОТ (в ЕИ параметров инициализации панели переводим из ч/ч, т.к. мы считали из графика среднемесячное количество часов) */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 3, NVALUE => NPERS_LAB);
+ NPERS_LAB := F_DICMUNTS_BASE_RECALC_QUANT(NFLAG_SMART => 0,
+ NCOMPANY => NCOMPANY,
+ NUMEAS_FROM => NLAB_MEAS_HOURS,
+ NQUANT_FROM => NPERS_LAB,
+ NUMEAS_TO => RJB_PRMS.LAB_MEAS);
+ /* Накопим сумму в буфере результата */
+ NLAB_PLAN_FOT := NLAB_PLAN_FOT + NPERS_LAB;
+ /* При формировании списка для клиента */
+ if (NMODE = 0) then
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPERSON',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB_PLAN_FOT', NVALUE => NPERS_LAB);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end if;
end loop;
/* Освобождаем курсор */
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
@@ -5075,58 +5155,362 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise;
end;
- /* Сериализуем описание */
- COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
- end JB_PERIODS_LIST_PLAN_FOT;
+ /* При формировании списка для клиента */
+ if (NMODE = 0) then
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end if;
+ end JB_PERIODS_PLAN_FOT_BUILD;
- /* Получение плановой трудоёмкости по ФОТ для периода балансировки (в часах) */
- function JB_PERIODS_GET_PLAN_FOT
+ /* Получение списка для детализации трудоёмкости по ФОТ периода балансировки */
+ procedure JB_PERIODS_PLAN_FOT_LIST
(
- NCOMPANY in number, -- Рег. номер организации
- DDATE_FROM in date, -- Начало
- DDATE_TO in date, -- Окончание
- NINS_DEPARTMENT in number, -- Рег. номер штатного подразделения
- NFCMANPOWER in number -- Рег. номер трудового ресурса
+ NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NTMP PKG_STD.TLNUMBER; -- Буфер для рассчетов
+ begin
+ /* Сформируем список детализации по ФОТ */
+ JB_PERIODS_PLAN_FOT_BUILD(NJB_PERIODS => NJB_PERIODS,
+ NMODE => 0,
+ NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ CORDERS => CORDERS,
+ NINCLUDE_DEF => NINCLUDE_DEF,
+ NLAB_PLAN_FOT => NTMP,
+ COUT => COUT);
+ end JB_PERIODS_PLAN_FOT_LIST;
+
+ /* Расчет плановой трудоёмкости по ФОТ для периода балансировки (в часах) */
+ function JB_PERIODS_PLAN_FOT_CALC
+ (
+ NJB_PERIODS in number -- Рег. номер записи периода в буфере балансировки
) return number -- Плановая трудоёмкость по ФОТ (в часах)
is
NRES PKG_STD.TLNUMBER; -- Плановая трудоёмкость по ФОТ
+ CTMP clob; -- Буфер для вычислений
begin
- /* Обойдем подходящие исполнения и просуммируем среднемесячную численность часов */
- select sum(SH.AVG_HOURS)
- into NRES
- from CLNPSPFM FM,
- CLNPSDEP PSD,
- PRPROF PROF,
- CLNPSPFMHS FMH,
- SLSCHEDULE SH
- where FM.COMPANY = NCOMPANY
- and FM.DEPTRN = NINS_DEPARTMENT
- and FM.PSDEPRN = PSD.RN
- and PSD.PRPROF = PROF.RN
- and PROF.RN in (select MP.PRPROF from FCMANPOWER MP where MP.RN = NFCMANPOWER)
- and ((FM.BEGENG between DDATE_FROM and DDATE_TO) or (FM.ENDENG between DDATE_FROM and DDATE_TO) or
- ((FM.BEGENG < DDATE_FROM) and (COALESCE(FM.ENDENG, DDATE_TO + 1) > DDATE_TO)))
- and FM.RN = FMH.PRN
- and ((FMH.DO_ACT_FROM between DDATE_FROM and DDATE_TO) or (FMH.DO_ACT_TO between DDATE_FROM and DDATE_TO) or
- ((FMH.DO_ACT_FROM < DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, DDATE_TO + 1) > DDATE_TO)))
- and FMH.SCHEDULE = SH.RN;
+ /* Рассчитаем плановую трудоемкость по ФОТ */
+ JB_PERIODS_PLAN_FOT_BUILD(NJB_PERIODS => NJB_PERIODS, NMODE => 1, NLAB_PLAN_FOT => NRES, COUT => CTMP);
/* Вернём собранный результат */
- return COALESCE(NRES, 0);
- end JB_PERIODS_GET_PLAN_FOT;
-
- /* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
- procedure JB_PERIODS_LIST_PLAN_JOBS
+ return NRES;
+ end JB_PERIODS_PLAN_FOT_CALC;
+
+ /* Формирование и расчёт списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */
+ procedure JB_PERIODS_FACT_RPT_BUILD
(
NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
- NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
- NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
- CORDERS in clob, -- Сортировки
- NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
- COUT out clob -- Сериализованная таблица данных
+ NMODE in number := 0, -- Режим (0 - список для клиента, 1 - только расчёты)
+ NPAGE_NUMBER in number := 0, -- Номер страницы (игнорируется при NPAGE_SIZE=0 и NMODE = 1)
+ NPAGE_SIZE in number := 0, -- Количество записей на странице (0 - все, игнорируется при NMODE = 1)
+ CORDERS in clob := null, -- Сортировки (игнорируется при NMODE = 1)
+ NINCLUDE_DEF in number := 1, -- Признак включения описания колонок таблицы в ответ (игнорируется при NMODE = 1)
+ NLAB_FACT_RPT out number, -- Фактическая трудоёмкость согласно "Планам и отчетам подразделений"
+ COUT out clob -- Сериализованная таблица данных (заполняется только при NMODE = 0)
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода
+ RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ DJOB_BEG PKG_STD.TLDATE; -- Дата начала текущей работы согласно проекту
+ DJOB_END PKG_STD.TLDATE; -- Дата окончания текущей работы согласно проекту
+ NJOB_DUR PKG_STD.TLNUMBER; -- Длительнось текущей работы согласно проекту
+ NJOB_LAB PKG_STD.TLNUMBER; -- Трудоёмкость текущей работы согласно отчету
+ NJOB_LAB_MEAS PKG_STD.TREF; -- ЕИ трудоемкости текущей работы согласно проекту
+ begin
+ /* Инициализируем сумму фактической трудоёмкости согласно "Планам и отчетам подразделений" */
+ NLAB_FACT_RPT := 0;
+ /* Считаем детализируемую запись периода */
+ RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS);
+ /* Считаем параметры балансировки */
+ RJB_PRMS := JB_PRMS_GET(NIDENT => RPRD.IDENT);
+ /* Если не формируем данные для клиента */
+ if (NMODE = 1) then
+ /* Преобразуем номер и размер страницы в номер строк с и по - нам нужны все записи */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => 0,
+ NPAGE_SIZE => 0,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ else
+ /* Будем строить курсор по параметрам - читаем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Добавляем в таблицу описание колонок */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер трудового ресурса отчета',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPRJDEPLAN',
+ SCAPTION => 'Документ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPRJ',
+ SCAPTION => 'Проект',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTG_JOB',
+ SCAPTION => 'Этап-работа',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SJOB_NAME',
+ SCAPTION => 'Наим. работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NJOB_STATE',
+ SCAPTION => 'Сост. работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DJOB_BEG',
+ SCAPTION => 'Начало работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DJOB_END',
+ SCAPTION => 'Окончание работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NJOB_DUR',
+ SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPERSON',
+ SCAPTION => 'Сотрудник',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLAB',
+ SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BORDER => true);
+ end if;
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Обходим закрытые планы и отчеты подразеделений, подходящие по параметрам */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select MP.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE || '', '' || trim(T.DOCPREF) || ''/'' || trim(T.DOCNUMB) || '', '' || TO_CHAR(T.DOCDATE, ''dd.mm.yyyy'') SPRJDEPLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(COALESCE(PS.NUMB, ''Б/Э'')) || ''-'' || trim(PJ.NUMB) SSTG_JOB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.NAME SJOB_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.BEGPLAN DJOB_BEG,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.ENDPLAN DJOB_END,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F_CLNPERSONS_FORMAT_CODE(FMP.COMPANY, FMP.CODE) SPERSON,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MP.LABOUR_F NLAB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.UMEAS NLAB_MEAS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PRJDEPLAN T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ENPERIOD PR,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PRJDEPLANMANPOW MP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join CLNPSPFM FM on MP.CLNPSPFM = FM.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join CLNPERSONS FMP on FM.PERSRN = FMP.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join PROJECTSTAGE PS on PJ.PROJECTSTAGE = PS.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOBMANPOW PJMP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.STATE = 2');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PERIOD = PR.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOCTYPE = DT.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.SUBDIV = :NINS_DEPARTMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((PR.STARTDATE between :DDATE_FROM and :DDATE_TO) or (PR.ENDDATE between :DDATE_FROM and :DDATE_TO) or');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((PR.STARTDATE < :DDATE_FROM) and (PR.ENDDATE > :DDATE_TO)))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PRN in (select PJ.RN from PRJDEPPLANJOB PJ where PJ.PRN = T.RN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PROJECTJOBMANPOW = PJMP.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.PRN = PJ.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'ProjectDepartmentPlans') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ 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 => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NINS_DEPARTMENT', NVALUE => RPRD.INS_DEPARTMENT);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMANPOWER', NVALUE => RPRD.FCMANPOWER);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => RPRD.DATE_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => RPRD.DATE_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(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);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Вычислим длительость работы в ЕИ панели */
+ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 7, DVALUE => DJOB_BEG);
+ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 8, DVALUE => DJOB_END);
+ P_PROJECTJOB_GET_DURATION(NCOMPANY => NCOMPANY,
+ DBEG_DATE => DJOB_BEG,
+ DEND_DATE => DJOB_END,
+ NDURATION_MEAS => RJB_PRMS.DURATION_MEAS,
+ NDURATION => NJOB_DUR);
+ /* Вычислим трудоёмкость работ в ЕИ панели */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NJOB_LAB);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NJOB_LAB_MEAS);
+ NJOB_LAB := F_DICMUNTS_BASE_RECALC_QUANT(NFLAG_SMART => 0,
+ NCOMPANY => NCOMPANY,
+ NUMEAS_FROM => NJOB_LAB_MEAS,
+ NQUANT_FROM => NJOB_LAB,
+ NUMEAS_TO => RJB_PRMS.LAB_MEAS);
+ /* Накопим сумму в буфере результата */
+ NLAB_FACT_RPT := NLAB_FACT_RPT + NJOB_LAB;
+ /* При формировании списка для клиента */
+ if (NMODE = 0) then
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPRJDEPLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SSTG_JOB',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SJOB_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NJOB_STATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPERSON',
+ ICURSOR => ICURSOR,
+ NPOSITION => 9);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB', NVALUE => NJOB_LAB);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end if;
+ end loop;
+ /* Освобождаем курсор */
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* При формировании списка для клиента */
+ if (NMODE = 0) then
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end if;
+ end JB_PERIODS_FACT_RPT_BUILD;
+
+ /* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */
+ procedure JB_PERIODS_FACT_RPT_LIST
+ (
+ NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NTMP PKG_STD.TLNUMBER; -- Буфер для рассчетов
+ begin
+ /* Сформируем список детализации по "Планам и отчетам подразделений" */
+ JB_PERIODS_FACT_RPT_BUILD(NJB_PERIODS => NJB_PERIODS,
+ NMODE => 0,
+ NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ CORDERS => CORDERS,
+ NINCLUDE_DEF => NINCLUDE_DEF,
+ NLAB_FACT_RPT => NTMP,
+ COUT => COUT);
+ end JB_PERIODS_FACT_RPT_LIST;
+
+ /* Расчёт фактической трудоёмкости трудового ресурса по "Планам и отчетам подразделеий" для периода балансировки */
+ function JB_PERIODS_FACT_RPT_CALC
+ (
+ NJB_PERIODS in number -- Рег. номер записи периода в буфере балансировки
+ ) return number -- Фактическая трудоёмкость трудового ресурса по "Планам и отчетам подразделеий"
+ is
+ NRES PKG_STD.TLNUMBER; -- Буфер для результата
+ CTMP clob; -- Буфер для вычислений
+ begin
+ /* Рассчитаем фактическую трудоемкость по "Планам и отчетам подразделений" */
+ JB_PERIODS_FACT_RPT_BUILD(NJB_PERIODS => NJB_PERIODS, NMODE => 1, NLAB_FACT_RPT => NRES, COUT => CTMP);
+ /* Вернём собранный результат */
+ return NRES;
+ end JB_PERIODS_FACT_RPT_CALC;
+
+ /* Формирование и расчёт списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
+ procedure JB_PERIODS_PLAN_JOBS_BUILD
+ (
+ NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
+ NMODE in number := 0, -- Режим (0 - список для клиента, 1 - только расчёты)
+ NPAGE_NUMBER in number := 0, -- Номер страницы (игнорируется при NPAGE_SIZE=0 и NMODE = 1)
+ NPAGE_SIZE in number := 0, -- Количество записей на странице (0 - все, игнорируется при NMODE = 1)
+ CORDERS in clob := null, -- Сортировки (игнорируется при NMODE = 1)
+ NINCLUDE_DEF in number := 1, -- Признак включения описания колонок таблицы в ответ (игнорируется при NMODE = 1)
+ NLAB_PLAN_JOB out number, -- Плановая трудоёмкость согласно графика
+ COUT out clob -- Сериализованная таблица данных (заполняется только при NMODE = 0)
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода
+ RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки
RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
@@ -5139,97 +5523,97 @@ text="Проверить, что для расчётных полей дата-
DJOB_BEG PKG_STD.TLDATE; -- Дата начала текущей работы согласно плану-груфику
DJOB_END PKG_STD.TLDATE; -- Дата окончания текущей работы согласно плану-груфику
NJOB_DUR PKG_STD.TLNUMBER; -- Длительнось текущей работы согласно плану-груфику
+ NMP_LAB_MEAS PKG_STD.TREF; -- ЕИ трудоёмкости трудового ресурса согласно проекта
NMP_LAB PKG_STD.TLNUMBER; -- Трудоёмкость трудового ресурса в текущей работе согласно проекта
NMP_LAB_ONE PKG_STD.TLNUMBER; -- Трудоёмкость (за единицу длительности) трудового ресурса в текущей работе согласно проекта
NMP_LAB_PLAN PKG_STD.TLNUMBER; -- Трудоёмкость трудового ресурса в текущей работе согласно плана-графика
begin
+ /* Инициализируем сумму плановой трудоёмкости согласно графика */
+ NLAB_PLAN_JOB := 0;
/* Считаем детализируемую запись периода */
RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS);
- /* Читем сортировки */
- RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
- /* Преобразуем номер и размер страницы в номер строк с и по */
- PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
- NPAGE_SIZE => NPAGE_SIZE,
- NROW_FROM => NROW_FROM,
- NROW_TO => NROW_TO);
- /* Инициализируем таблицу данных */
- RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
- /* Добавляем в таблицу описание колонок */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NRN',
- SCAPTION => 'Рег. номер работы в буфере балансировки',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NPROJECT',
- SCAPTION => 'Рег. номер проекта',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NJB_PRJCTS',
- SCAPTION => 'Рег. номер буфера балансировки проекта',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SPRJ',
- SCAPTION => 'Проект',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SSTG_JOB',
- SCAPTION => 'Этап-работа',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SJOB_NAME',
- SCAPTION => 'Наим. работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NJOB_STATE',
- SCAPTION => 'Сост. работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'DJOB_BEG',
- SCAPTION => 'Начало работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'DJOB_END',
- SCAPTION => 'Окончание работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
- BORDER => true,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NJOB_DUR',
- SCAPTION => 'Длительн. работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NMP_LAB',
- SCAPTION => 'Труд.',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NMP_LAB_ONE',
- SCAPTION => 'Труд. (в ед. длит.)',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false,
- BFILTER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NMP_LAB_PLAN',
- SCAPTION => 'Труд. (план, график)',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false,
- BFILTER => false);
+ /* Считаем параметры балансировки */
+ RJB_PRMS := JB_PRMS_GET(NIDENT => RPRD.IDENT);
+ /* Если не формируем данные для клиента */
+ if (NMODE = 1) then
+ /* Преобразуем номер и размер страницы в номер строк с и по - нам нужны все записи */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => 0,
+ NPAGE_SIZE => 0,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ else
+ /* Будем строить курсор по параметрам - читаем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Добавляем в таблицу описание колонок */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер работы в буфере балансировки',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROJECT',
+ SCAPTION => 'Рег. номер проекта',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NJB_PRJCTS',
+ SCAPTION => 'Рег. номер буфера балансировки проекта',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPRJ',
+ SCAPTION => 'Проект',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTG_JOB',
+ SCAPTION => 'Этап-работа',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SJOB_NAME',
+ SCAPTION => 'Наим. работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NJOB_STATE',
+ SCAPTION => 'Сост. работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DJOB_BEG',
+ SCAPTION => 'Начало работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DJOB_END',
+ SCAPTION => 'Окончание работы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NJOB_DUR',
+ SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NMP_LAB',
+ SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NMP_LAB_ONE',
+ SCAPTION => 'Труд. (в ед. длит., ' || RJB_PRMS.LAB_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NMP_LAB_PLAN',
+ SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
+ end if;
/* Обходим данные */
begin
/* Добавляем подсказку совместимости */
@@ -5238,7 +5622,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select JB.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select JB.RN NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.RN NPROJECT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JBP.RN NJB_PRJCTS,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,');
@@ -5247,7 +5631,8 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JB.DATE_FROM DJOB_BEG,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JB.DATE_TO DJOB_END,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.LABOUR_P NLABOUR_P');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.LABOUR_P NLABOUR_P,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.UMEAS NLABOUR_P_UMEAS');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from P8PNL_JB_JOBS JB,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P8PNL_JB_PRJCTS JBP,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ');
@@ -5264,7 +5649,10 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.SUBDIV = :NINS_DEPARTMENT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((JB.DATE_FROM between :DDATE_FROM and :DDATE_TO) or (JB.DATE_TO between :DDATE_FROM and :DDATE_TO) or');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO))) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO)))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = P.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
@@ -5292,6 +5680,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.DEFINE_COLUMN_DATE(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);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -5299,16 +5688,22 @@ text="Проверить, что для расчётных полей дата-
/* Обходим выбранные записи */
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
- /* Вычислим трудоёмкость в датлизируемом периоде по буферу балансировки */
+ /* Вычислим длительность и трудоёмкость в датлизируемом периоде по буферу балансировки (в ЕИ панели) */
PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 8, DVALUE => DJOB_BEG);
PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 9, DVALUE => DJOB_END);
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NMP_LAB);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NMP_LAB_MEAS);
P_PROJECTJOB_GET_DURATION(NCOMPANY => NCOMPANY,
DBEG_DATE => DJOB_BEG,
DEND_DATE => DJOB_END,
- NDURATION_MEAS => NJB_DURATION_MEAS,
+ NDURATION_MEAS => RJB_PRMS.DURATION_MEAS,
NDURATION => NJOB_DUR);
- DBEG := RPRD.DATE_FROM;
+ NMP_LAB := F_DICMUNTS_BASE_RECALC_QUANT(NFLAG_SMART => 0,
+ NCOMPANY => NCOMPANY,
+ NUMEAS_FROM => NMP_LAB_MEAS,
+ NQUANT_FROM => NMP_LAB,
+ NUMEAS_TO => RJB_PRMS.LAB_MEAS);
+ DBEG := RPRD.DATE_FROM;
if (DJOB_BEG > RPRD.DATE_FROM) then
DBEG := DJOB_BEG;
end if;
@@ -5320,37 +5715,48 @@ text="Проверить, что для расчётных полей дата-
NMP_LAB_ONE := ROUND(NMP_LAB / (DJOB_END - DJOB_BEG), 3);
else
NMP_LAB_ONE := ROUND(NMP_LAB, 3);
- end if;
+ end if;
NMP_LAB_PLAN := ROUND((DEND - DBEG) * NMP_LAB_ONE, 3);
- /* Добавляем колонки с данными */
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NRN',
- ICURSOR => ICURSOR,
- NPOSITION => 1,
- BCLEAR => true);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROJECT', ICURSOR => ICURSOR, NPOSITION => 2);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NJB_PRJCTS',
- ICURSOR => ICURSOR,
- NPOSITION => 3);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 4);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTG_JOB', ICURSOR => ICURSOR, NPOSITION => 5);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
- SNAME => 'SJOB_NAME',
- ICURSOR => ICURSOR,
- NPOSITION => 6);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NJOB_STATE',
- ICURSOR => ICURSOR,
- NPOSITION => 7);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB', NVALUE => NMP_LAB);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_ONE', NVALUE => NMP_LAB_ONE);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_PLAN', NVALUE => NMP_LAB_PLAN);
- /* Добавляем строку в таблицу */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ /* Накопим сумму в буфере результата */
+ NLAB_PLAN_JOB := NLAB_PLAN_JOB + NMP_LAB_PLAN;
+ /* При формировании списка для клиента */
+ if (NMODE = 0) then
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPROJECT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NJB_PRJCTS',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SSTG_JOB',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SJOB_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NJOB_STATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB', NVALUE => NMP_LAB);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_ONE', NVALUE => NMP_LAB_ONE);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_PLAN', NVALUE => NMP_LAB_PLAN);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end if;
end loop;
/* Освобождаем курсор */
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
@@ -5359,308 +5765,69 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise;
end;
- /* Сериализуем описание */
- COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
- end JB_PERIODS_LIST_PLAN_JOBS;
+ /* При формировании списка для клиента */
+ if (NMODE = 0) then
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end if;
+ end JB_PERIODS_PLAN_JOBS_BUILD;
- /* Получение плановой трудоёмкости по текущему состоянию графиков в буфере балансировки для периода балансировки */
- function JB_PERIODS_GET_PLAN_JOBS
+ /* Получение списка для детализации трудоёмкости периода балансировки по текущему состоянию графика */
+ procedure JB_PERIODS_PLAN_JOBS_LIST
(
- NIDENT in number, -- Идентификатор процесса
- DDATE_FROM in date, -- Начало
- DDATE_TO in date, -- Окончание
- NINS_DEPARTMENT in number, -- Рег. номер штатного подразделения
- NFCMANPOWER in number -- Рег. номер трудового ресурса
+ NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NTMP PKG_STD.TLNUMBER; -- Буфер для рассчетов
+ begin
+ /* Сформируем список детализации по текущему состоянию плана-графика */
+ JB_PERIODS_PLAN_JOBS_BUILD(NJB_PERIODS => NJB_PERIODS,
+ NMODE => 0,
+ NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ CORDERS => CORDERS,
+ NINCLUDE_DEF => NINCLUDE_DEF,
+ NLAB_PLAN_JOB => NTMP,
+ COUT => COUT);
+ end JB_PERIODS_PLAN_JOBS_LIST;
+
+ /* Расчёт плановой трудоёмкости по текущему состоянию графиков в буфере балансировки для периода балансировки */
+ function JB_PERIODS_PLAN_JOBS_CALC
+ (
+ NJB_PERIODS in number -- Рег. номер записи периода в буфере балансировки
) return number -- Плановая трудоёмкость по текущему состоянию графиков в буфере балансировки
is
NRES PKG_STD.TLNUMBER; -- Буфер для результата
- NPLAN_JOB PKG_STD.TLNUMBER; -- Плановая трудоёмкость текущей работы согласно графика
- DBEG PKG_STD.TLDATE; -- Дата начала для расчёта трудоёмкости текущей работы
- DEND PKG_STD.TLDATE; -- Дата окончания для расчёта трудоёмкости текущей работы
+ CTMP clob; -- Буфер для вычислений
begin
- /* Обходим все работы в буфере подходящие по условиям */
- for C in (select JB.*,
- PJMP.LABOUR_P
- from P8PNL_JB_JOBS JB,
- PROJECTJOB PJ,
- PROJECTJOBMANPOW PJMP
- where JB.IDENT = NIDENT
- and JB.STAGE = 0
- and JB.SOURCE = PJ.RN
- and PJ.RN = PJMP.PRN
- and PJMP.FCMANPOWER = NFCMANPOWER
- and PJMP.SUBDIV = NINS_DEPARTMENT
- and ((JB.DATE_FROM between DDATE_FROM and DDATE_TO) or (JB.DATE_TO between DDATE_FROM and DDATE_TO) or
- ((JB.DATE_FROM < DDATE_FROM) and (JB.DATE_TO > DDATE_TO))))
- loop
- /* Вычислим трудоёмкость по графику для попавшейся работы */
- DBEG := DDATE_FROM;
- if (C.DATE_FROM > DDATE_FROM) then
- DBEG := C.DATE_FROM;
- end if;
- DEND := DDATE_TO;
- if (C.DATE_TO < DDATE_TO) then
- DEND := C.DATE_TO;
- end if;
- if (C.LABOUR_P <> 0) then
- if (C.DATE_TO - C.DATE_FROM <> 0) then
- NPLAN_JOB := ROUND((DEND - DBEG) * (C.LABOUR_P / (C.DATE_TO - C.DATE_FROM)), 3);
- else
- NPLAN_JOB := ROUND((DEND - DBEG) * C.LABOUR_P, 3);
- end if;
- else
- NPLAN_JOB := 0;
- end if;
- /* Накопим сумму в буфере результата */
- NRES := COALESCE(NRES, 0) + NPLAN_JOB;
- end loop;
- /* Вернём собранный результат */
- return COALESCE(NRES, 0);
- end JB_PERIODS_GET_PLAN_JOBS;
+ /* Рассчитаем плановую трудоёмкость по текущему состоянию графиков */
+ JB_PERIODS_PLAN_JOBS_BUILD(NJB_PERIODS => NJB_PERIODS, NMODE => 1, NLAB_PLAN_JOB => NRES, COUT => CTMP);
+ /* Вернём результат */
+ return NRES;
+ end JB_PERIODS_PLAN_JOBS_CALC;
- /* Получение списка для детализации фактической трудоёмкости периода балансировки по "Планам и отчетам подразделений" */
- procedure JB_PERIODS_LIST_FACT_RPT
+ /* Установка трудоемкостей в записи периода балансировки работ */
+ procedure JB_PERIODS_SET_LAB
(
- NJB_PERIODS in number, -- Рег. номер записи периода в буфере балансировки
- NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
- NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
- CORDERS in clob, -- Сортировки
- NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
- COUT out clob -- Сериализованная таблица данных
- )
+ NJB_PERIODS in number, -- Рег. номер записи периода балансировки
+ NLAB_PLAN_FOT in number, -- Плановая трудоёмкость по ФОТ
+ NLAB_FACT_RPT in number, -- Фактическая трудоёмкость по "Планам и отчетам подразделений"
+ NLAB_PLAN_JOBS in number -- Плановая трудоёмкость по плану-графику
+ )
is
- NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
- RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода
- RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
- RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
- RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
- CSQL clob; -- Буфер для запроса
- ICURSOR integer; -- Курсор для исполнения запроса
- NROW_FROM PKG_STD.TREF; -- Номер строки с
- NROW_TO PKG_STD.TREF; -- Номер строки по
- DJOB_BEG PKG_STD.TLDATE; -- Дата начала текущей работы согласно плану-груфику
- DJOB_END PKG_STD.TLDATE; -- Дата окончания текущей работы согласно плану-груфику
- NJOB_DUR PKG_STD.TLNUMBER; -- Длительнось текущей работы согласно плану-груфику
begin
- /* Считаем детализируемую запись периода */
- RPRD := JB_PERIODS_GET(NJB_PERIODS => NJB_PERIODS);
- /* Читем сортировки */
- RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
- /* Преобразуем номер и размер страницы в номер строк с и по */
- PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
- NPAGE_SIZE => NPAGE_SIZE,
- NROW_FROM => NROW_FROM,
- NROW_TO => NROW_TO);
- /* Инициализируем таблицу данных */
- RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
- /* Добавляем в таблицу описание колонок */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NRN',
- SCAPTION => 'Рег. номер трудового ресурса отчета',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SPRJDEPLAN',
- SCAPTION => 'Документ',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BVISIBLE => true,
- BORDER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SPRJ',
- SCAPTION => 'Проект',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SSTG_JOB',
- SCAPTION => 'Этап-работа',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SJOB_NAME',
- SCAPTION => 'Наим. работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NJOB_STATE',
- SCAPTION => 'Сост. работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'DJOB_BEG',
- SCAPTION => 'Начало работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'DJOB_END',
- SCAPTION => 'Окончание работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NJOB_DUR',
- SCAPTION => 'Длительн. работы',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'SPERSON',
- SCAPTION => 'Сотрудник',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
- BORDER => true);
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
- SNAME => 'NLAB',
- SCAPTION => 'Труд.',
- SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BORDER => false);
- /* Обходим данные */
- begin
- /* Добавляем подсказку совместимости */
- CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
- /* Формируем запрос */
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select MP.RN NRN,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE || '', '' || trim(T.DOCPREF) || ''/'' || trim(T.DOCNUMB) || '', '' || TO_CHAR(T.DOCDATE, ''dd.mm.yyyy'') SPRJDEPLAN,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(COALESCE(PS.NUMB, ''Б/Э'')) || ''-'' || trim(PJ.NUMB) SSTG_JOB,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.NAME SJOB_NAME,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.BEGPLAN DJOB_BEG,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.ENDPLAN DJOB_END,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F_CLNPERSONS_FORMAT_CODE(FMP.COMPANY, FMP.CODE) SPERSON,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MP.LABOUR_F NLAB');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PRJDEPLAN T,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ENPERIOD PR,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PRJDEPLANMANPOW MP,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTSTAGE PS,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOBMANPOW PJMP,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPSPFM FM,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPERSONS FMP');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.STATE = 2');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PERIOD = PR.RN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOCTYPE = DT.RN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.SUBDIV = :NINS_DEPARTMENT');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((PR.STARTDATE between :DDATE_FROM and :DDATE_TO) or (PR.ENDDATE between :DDATE_FROM and :DDATE_TO) or');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((PR.STARTDATE < :DDATE_FROM) and (PR.ENDDATE > :DDATE_TO)))');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PRN in (select PJ.RN from PRJDEPPLANJOB PJ where PJ.PRN = T.RN)');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.PROJECTJOBMANPOW = PJMP.RN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and MP.CLNPSPFM = FM.RN(+)');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.PERSRN = FMP.RN(+)');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.PRN = PJ.RN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PROJECTSTAGE = PS.RN(+) %ORDER_BY%) D) F');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
- /* Учтём сортировки */
- PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
- /* Разбираем его */
- 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 => 'NCOMPANY', NVALUE => NCOMPANY);
- PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NINS_DEPARTMENT', NVALUE => RPRD.INS_DEPARTMENT);
- PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMANPOWER', NVALUE => RPRD.FCMANPOWER);
- PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => RPRD.DATE_FROM);
- PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => RPRD.DATE_TO);
- PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
- PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
- /* Описываем структуру записи курсора */
- PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
- PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
- PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
- PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
- PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
- PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
- PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 7);
- PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 8);
- PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 9);
- PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
- PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
- /* Делаем выборку */
- if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
- null;
- end if;
- /* Обходим выбранные записи */
- while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
- loop
- /* Вычислим длительость работы в ЕИ панели */
- PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 7, DVALUE => DJOB_BEG);
- PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 8, DVALUE => DJOB_END);
- P_PROJECTJOB_GET_DURATION(NCOMPANY => NCOMPANY,
- DBEG_DATE => DJOB_BEG,
- DEND_DATE => DJOB_END,
- NDURATION_MEAS => NJB_DURATION_MEAS,
- NDURATION => NJOB_DUR);
- /* Добавляем колонки с данными */
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NRN',
- ICURSOR => ICURSOR,
- NPOSITION => 1,
- BCLEAR => true);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJDEPLAN', ICURSOR => ICURSOR, NPOSITION => 2);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 3);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTG_JOB', ICURSOR => ICURSOR, NPOSITION => 4);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
- SNAME => 'SJOB_NAME',
- ICURSOR => ICURSOR,
- NPOSITION => 5);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
- SNAME => 'NJOB_STATE',
- ICURSOR => ICURSOR,
- NPOSITION => 6);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END);
- PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPERSON', ICURSOR => ICURSOR, NPOSITION => 9);
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NLAB', ICURSOR => ICURSOR, NPOSITION => 10);
- /* Добавляем строку в таблицу */
- PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
- 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.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
- end JB_PERIODS_LIST_FACT_RPT;
-
- /* Получение фактической трудоёмкости трудового ресурса по "Планам и отчетам подразделеий" для периода балансировки */
- function JB_PERIODS_GET_FACT_RPT
- (
- NCOMPANY in number, -- Рег. номер организации
- DDATE_FROM in date, -- Начало
- DDATE_TO in date, -- Окончание
- NINS_DEPARTMENT in number, -- Рег. номер штатного подразделения
- NFCMANPOWER in number -- Рег. номер трудового ресурса
- ) return number -- Фактическая трудоёмкость трудового ресурса по "Планам и отчетам подразделеий"
- is
- NRES PKG_STD.TLNUMBER; -- Буфер для результата
- begin
- /* Суммируем фактические трудоёмкости из закрытых планов и отчетов подразеделений подходящим по параметрам */
- select sum(MP.LABOUR_F)
- into NRES
- from PRJDEPLAN T,
- ENPERIOD P,
- PRJDEPLANMANPOW MP,
- PROJECTJOBMANPOW PJMP
- where T.COMPANY = NCOMPANY
- and T.STATE = 2
- and T.PERIOD = P.RN
- and T.SUBDIV = NINS_DEPARTMENT
- and ((P.STARTDATE between DDATE_FROM and DDATE_TO) or (P.ENDDATE between DDATE_FROM and DDATE_TO) or
- ((P.STARTDATE < DDATE_FROM) and (P.ENDDATE > DDATE_TO)))
- and MP.PRN in (select PJ.RN from PRJDEPPLANJOB PJ where PJ.PRN = T.RN)
- and MP.PROJECTJOBMANPOW = PJMP.RN
- and PJMP.FCMANPOWER = NFCMANPOWER;
- /* Вернём собранный результат */
- return COALESCE(NRES, 0);
- end JB_PERIODS_GET_FACT_RPT;
+ /* Установим трудоёмкости */
+ update P8PNL_JB_PERIODS T
+ set T.LAB_PLAN_FOT = NLAB_PLAN_FOT,
+ T.LAB_FACT_RPT = NLAB_FACT_RPT,
+ T.LAB_PLAN_JOBS = NLAB_PLAN_JOBS
+ where T.RN = NJB_PERIODS;
+ end JB_PERIODS_SET_LAB;
/* Базовое добавление периода балансировки работ */
procedure JB_PERIODS_BASE_INSERT
@@ -5716,22 +5883,23 @@ text="Проверить, что для расчётных полей дата-
/* Пересчёт периодов балансировки */
procedure JB_PERIODS_RECALC
(
- NIDENT in number, -- Идентификатор процесса
- DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
- NINITIAL in number, -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт)
- NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
+ NIDENT in number, -- Идентификатор процесса
+ NINITIAL in number, -- Признак первоначального рассчёта (0 - пересчёт, 1 - первоначальный рассчёт)
+ NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
)
is
- NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
- DJB_BEG PKG_STD.TLDATE; -- Дата начала периода балансировки
- DJB_END PKG_STD.TLDATE; -- Дата окончания периода балансировки
- DBEG PKG_STD.TLDATE; -- Дата начала текущего месяца периода балансировки
- DEND PKG_STD.TLDATE; -- Дата окончания текущего месяца периода балансировки
- NJB_PERIODS PKG_STD.TREF; -- Рег. номер добавленного периода балансировки
- NLAB_PLAN_FOT PKG_STD.TLNUMBER; -- Плановая трудоёмкость по ФОТ для текущего месяца периода балансировки
- NLAB_FACT_RPT PKG_STD.TLNUMBER; -- Фактическая трудоёмкость по "Планам и отчетам подразделений" для текущего месяца периода балансировки
- NLAB_PLAN_JOBS PKG_STD.TLNUMBER; -- Плановая трудоёмкость по плану-графику в буфере для текущего месяца периода балансировки
+ RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки
+ DJB_BEG PKG_STD.TLDATE; -- Дата начала периода балансировки
+ DJB_END PKG_STD.TLDATE; -- Дата окончания периода балансировки
+ DBEG PKG_STD.TLDATE; -- Дата начала текущего месяца периода балансировки
+ DEND PKG_STD.TLDATE; -- Дата окончания текущего месяца периода балансировки
+ NJB_PERIODS PKG_STD.TREF; -- Рег. номер добавленного периода балансировки
+ NLAB_PLAN_FOT PKG_STD.TLNUMBER; -- Плановая трудоёмкость по ФОТ для текущего месяца периода балансировки
+ NLAB_FACT_RPT PKG_STD.TLNUMBER; -- Фактическая трудоёмкость по "Планам и отчетам подразделений" для текущего месяца периода балансировки
+ NLAB_PLAN_JOBS PKG_STD.TLNUMBER; -- Плановая трудоёмкость по плану-графику в буфере для текущего месяца периода балансировки
begin
+ /* Считаем параметры балансировки */
+ RJB_PRMS := JB_PRMS_GET(NIDENT => NIDENT);
/* Подчистка при перерасчёте */
if (NINITIAL = 0) then
JB_PERIODS_CLEAN(NIDENT => NIDENT);
@@ -5739,7 +5907,7 @@ text="Проверить, что для расчётных полей дата-
/* Скажем, что нет отклонений */
NRESOURCE_STATUS := 0;
/* Определим период балансировки */
- DJB_BEG := DBEGIN;
+ DJB_BEG := RJB_PRMS.DATE_BEGIN;
DJB_END := JB_GET_END(NIDENT => NIDENT);
/* Сформируем записи периодов балансировки */
for I in 0 .. FLOOR(MONTHS_BETWEEN(DJB_END, DJB_BEG))
@@ -5759,37 +5927,70 @@ text="Проверить, что для расчётных полей дата-
and JB.SOURCE = J.RN
and J.RN = JMP.PRN
and JMP.SUBDIV is not null
+ and exists (select null from V_USERPRIV UP where UP.CATALOG = J.CRN)
+ and exists (select null
+ from V_USERPRIV UP
+ where UP.JUR_PERS = J.JUR_PERS
+ and UP.UNITCODE = 'Projects')
+ and exists (select null
+ from UNITLIST UL
+ where UL.UNITCODE = 'INS_DEPARTMENT'
+ and UL.CHECK_ACCESS_HIER = 0
+ and exists (select /*+ INDEX(UP I_USERPRIV_COMPANY_ROLEID) */
+ null
+ from USERPRIV UP
+ where UP.COMPANY = JMP.COMPANY
+ and UP.UNITCODE = 'INS_DEPARTMENT'
+ 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_COMPANY_AUTHID) */
+ null
+ from USERPRIV UP
+ where UP.COMPANY = JMP.COMPANY
+ and UP.UNITCODE = 'INS_DEPARTMENT'
+ and UP.AUTHID = UTILIZER)
+ union all
+ select /*+ INDEX(UP I_USERPRIV_HIERARCHY_ROLEID) */
+ null
+ from USERPRIV UP
+ where UP.HIERARCHY = JMP.SUBDIV
+ 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_HIERARCHY_AUTHID) */
+ null
+ from USERPRIV UP
+ where UP.HIERARCHY = JMP.SUBDIV
+ and UP.AUTHID = UTILIZER)
group by JMP.FCMANPOWER,
JMP.SUBDIV)
loop
- /* Рассчитаем трудоёмкость по ФОТ (в часах) */
- NLAB_PLAN_FOT := JB_PERIODS_GET_PLAN_FOT(NCOMPANY => NCOMPANY,
- DDATE_FROM => DBEG,
- DDATE_TO => DEND,
- NINS_DEPARTMENT => D.SUBDIV,
- NFCMANPOWER => D.FCMANPOWER);
- /* Рассчитаем трудоемкость по "Планам и отчетам подразделений" */
- NLAB_FACT_RPT := JB_PERIODS_GET_FACT_RPT(NCOMPANY => NCOMPANY,
- DDATE_FROM => DBEG,
- DDATE_TO => DEND,
- NINS_DEPARTMENT => D.SUBDIV,
- NFCMANPOWER => D.FCMANPOWER);
- /* Рассчитаем трудоёмкость по работам графика */
- NLAB_PLAN_JOBS := JB_PERIODS_GET_PLAN_JOBS(NIDENT => NIDENT,
- DDATE_FROM => DBEG,
- DDATE_TO => DEND,
- NINS_DEPARTMENT => D.SUBDIV,
- NFCMANPOWER => D.FCMANPOWER);
/* Добавим запись периода балансировки */
JB_PERIODS_BASE_INSERT(NIDENT => NIDENT,
DDATE_FROM => DBEG,
DDATE_TO => DEND,
NINS_DEPARTMENT => D.SUBDIV,
NFCMANPOWER => D.FCMANPOWER,
- NLAB_PLAN_FOT => NLAB_PLAN_FOT,
- NLAB_FACT_RPT => NLAB_FACT_RPT,
- NLAB_PLAN_JOBS => NLAB_PLAN_JOBS,
+ NLAB_PLAN_FOT => 0,
+ NLAB_FACT_RPT => 0,
+ NLAB_PLAN_JOBS => 0,
NJB_PERIODS => NJB_PERIODS);
+ /* Рассчитаем трудоёмкость по ФОТ (в часах) */
+ NLAB_PLAN_FOT := JB_PERIODS_PLAN_FOT_CALC(NJB_PERIODS => NJB_PERIODS);
+ /* Рассчитаем трудоемкость по "Планам и отчетам подразделений" */
+ NLAB_FACT_RPT := JB_PERIODS_FACT_RPT_CALC(NJB_PERIODS => NJB_PERIODS);
+ /* Рассчитаем трудоёмкость по работам графика */
+ NLAB_PLAN_JOBS := JB_PERIODS_PLAN_JOBS_CALC(NJB_PERIODS => NJB_PERIODS);
+ /* Сохраним расчёты */
+ JB_PERIODS_SET_LAB(NJB_PERIODS => NJB_PERIODS,
+ NLAB_PLAN_FOT => NLAB_PLAN_FOT,
+ NLAB_FACT_RPT => NLAB_FACT_RPT,
+ NLAB_PLAN_JOBS => NLAB_PLAN_JOBS);
/* Если плановая трудоёмкость по работам графика превысила ФОТ - значит с ресурсами всё плохо */
if (NLAB_PLAN_JOBS > NLAB_PLAN_FOT) then
NRESOURCE_STATUS := 1;
@@ -5809,6 +6010,7 @@ text="Проверить, что для расчётных полей дата-
COUT out clob -- Сериализованная таблица данных
)
is
+ RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки
RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
@@ -5817,7 +6019,9 @@ text="Проверить, что для расчётных полей дата-
NROW_FROM PKG_STD.TREF; -- Номер строки с
NROW_TO PKG_STD.TREF; -- Номер строки по
begin
- /* Читем сортировки */
+ /* Считаем параметры балансировки */
+ RJB_PRMS := JB_PRMS_GET(NIDENT => NIDENT);
+ /* Читаем сортировки */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
/* Преобразуем номер и размер страницы в номер строк с и по */
PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
@@ -5852,33 +6056,33 @@ text="Проверить, что для расчётных полей дата-
BFILTER => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NLAB_PLAN_FOT',
- SCAPTION => 'Труд. (план, ФОТ)',
+ SCAPTION => 'Труд. (план, ФОТ, ' || RJB_PRMS.LAB_MEAS_CODE || ')',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BORDER => true,
BFILTER => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NLAB_FACT_RPT',
- SCAPTION => 'Труд. (факт, отчёт)',
+ SCAPTION => 'Труд. (факт, отчёт, ' || RJB_PRMS.LAB_MEAS_CODE || ')',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => true,
BORDER => true,
BFILTER => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NLAB_DIFF_RPT_FOT',
- SCAPTION => 'Отклон. (факт-план)',
+ SCAPTION => 'Отклон. (факт-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => true,
BORDER => true,
BFILTER => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NLAB_PLAN_JOBS',
- SCAPTION => 'Труд. (план, график)',
+ SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BORDER => true,
BFILTER => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NLAB_DIFF_JOBS_FOT',
- SCAPTION => 'Отклон. (график-план)',
+ SCAPTION => 'Отклон. (график-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BORDER => true,
BFILTER => false);
@@ -5904,7 +6108,9 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMANPOWER MP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.IDENT = :NIDENT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.INS_DEPARTMENT = INSD.RN');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_BASE.UTL_DOC_ACCESS_CHECK') ||'(INSD.COMPANY, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'INS_DEPARTMENT') || ', INSD.RN) = 1');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
@@ -5989,6 +6195,8 @@ text="Проверить, что для расчётных полей дата-
)
is
begin
+ /* Удаляем параметры балансировки */
+ JB_PRMS_CLEAN(NIDENT => NIDENT);
/* Удаляем список предшествующих работ */
delete from P8PNL_JB_JOBSPREV T where T.IDENT = NIDENT;
/* Удаляем список работ */
@@ -6101,8 +6309,10 @@ text="Проверить, что для расчётных полей дата-
(
DBEGIN in out date, -- Дата начала периода мониторинга загрузки ресурсов
DFACT in out date, -- Факт по состоянию на
- NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
- SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости
+ NDURATION_MEAS out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
+ SDURATION_MEAS out varchar2, -- Единица измерения длительности (мнемокод)
+ NLAB_MEAS out number, -- Единица измерения трудоёмкости
+ SLAB_MEAS out varchar2, -- Единица измерения трудоёмкости (мнемокод)
NIDENT in out number, -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
)
@@ -6117,18 +6327,34 @@ text="Проверить, что для расчётных полей дата-
RH_JB_JOBS_PREV P8PNL_JB_JOBS%rowtype; -- Запись предшествующей работы в иехархии балансируемых
NDURATION P8PNL_JB_JOBS.DURATION%type; -- Длительност текущей работы/этапа
NEDITABLE PKG_STD.TREF; -- Признак возможности редактирования работы
- NLAB_MEAS PKG_STD.TREF; -- Рег. номер выбранной для рассчётов единицы измерения трудоёмкости
+ NPRMS PKG_STD.TREF; -- Рег. номер записи параметров балансировки
begin
/* Обработаем дату начала периода мониторинга загрузки ресурсов */
if (DBEGIN is null) then
DBEGIN := TRUNC(sysdate, 'yyyy');
else
- DBEGIN := TRUNC(DBEGIN, 'yyyy');
+ DBEGIN := TRUNC(DBEGIN, 'mm');
end if;
/* Обработаем дату факта */
- DFACT := TO_DATE('01.01.2022', 'DD.MM.YYYY');
+ if (DFACT is null) then
+ select LAST_DAY(TRUNC(COALESCE(max(ENP.ENDDATE), DBEGIN), 'mm'))
+ into DFACT
+ from PRJDEPLAN T,
+ ENPERIOD ENP
+ where T.COMPANY = NCOMPANY
+ and T.STATE = 2
+ and T.PERIOD = ENP.RN
+ and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN)
+ and exists (select null
+ from V_USERPRIV UP
+ where UP.JUR_PERS = T.JUR_PERS
+ and UP.UNITCODE = 'ProjectDepartmentPlans');
+ else
+ DFACT := LAST_DAY(TRUNC(DFACT, 'mm'));
+ end if;
/* Обработаем единицу измерения длительности (пока - она всегда должна быть "день", по умолчанию) */
NDURATION_MEAS := NJB_DURATION_MEAS;
+ SDURATION_MEAS := JB_GET_DURATION_MEAS_CODE(NDURATION_MEAS => NDURATION_MEAS);
/* Обработаем единицу измерения трудоёмкости (пока - она всегда должна быть "ч/ч", по умолчанию) */
SLAB_MEAS := SJB_LAB_MEAS;
FIND_DICMUNTS_BY_MNEMO(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, SMEAS_MNEMO => SLAB_MEAS, NRN => NLAB_MEAS);
@@ -6138,6 +6364,15 @@ text="Проверить, что для расчётных полей дата-
else
JB_CLEAN(NIDENT => NIDENT);
end if;
+ /* Сохраняем параметры балансировки */
+ JB_PRMS_BASE_INSERT(NIDENT => NIDENT,
+ DDATE_BEGIN => DBEGIN,
+ DDATE_FACT => DFACT,
+ NDURATION_MEAS => NDURATION_MEAS,
+ SDURATION_MEAS_CODE => SDURATION_MEAS,
+ NLAB_MEAS => NLAB_MEAS,
+ SLAB_MEAS_CODE => SLAB_MEAS,
+ NRN => NPRMS);
/* Обходим проекты */
for PRJ in (select P.RN NRN,
COALESCE((select 1
@@ -6296,7 +6531,7 @@ text="Проверить, что для расчётных полей дата-
end loop;
end loop;
/* Сформируем данные монитора загрузки ресурсов */
- JB_PERIODS_RECALC(NIDENT => NIDENT, DBEGIN => DBEGIN, NINITIAL => 1, NRESOURCE_STATUS => NRESOURCE_STATUS);
+ JB_PERIODS_RECALC(NIDENT => NIDENT, NINITIAL => 1, NRESOURCE_STATUS => NRESOURCE_STATUS);
end JB_INIT;
end PKG_P8PANELS_PROJECTS;
diff --git a/db/PKG_P8PANELS_SAMPLES.pck b/db/PKG_P8PANELS_SAMPLES.pck
index 2248b2e..1f7e228 100644
--- a/db/PKG_P8PANELS_SAMPLES.pck
+++ b/db/PKG_P8PANELS_SAMPLES.pck
@@ -255,7 +255,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as
NROW_FROM => NROW_FROM,
NROW_TO => NROW_TO);
/* Инициализируем таблицу данных */
- RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2);
/* Описываем колонки таблицы данных */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SAGNABBR',
@@ -264,7 +264,8 @@ create or replace package body PKG_P8PANELS_SAMPLES as
SCOND_FROM => 'AgentAbbr',
BVISIBLE => true,
BORDER => true,
- BFILTER => true);
+ BFILTER => true,
+ NWIDTH => 150);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SAGNINFO',
SCAPTION => 'Сведения',
@@ -272,7 +273,8 @@ create or replace package body PKG_P8PANELS_SAMPLES as
BVISIBLE => true,
BORDER => false,
BFILTER => false,
- BEXPANDABLE => true);
+ BEXPANDABLE => true,
+ NWIDTH => 300);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SAGNNAME',
SCAPTION => 'Наименование',
@@ -281,7 +283,8 @@ create or replace package body PKG_P8PANELS_SAMPLES as
BVISIBLE => true,
BORDER => true,
BFILTER => true,
- SPARENT => 'SAGNINFO');
+ SPARENT => 'SAGNINFO',
+ NWIDTH => 200);
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 0);
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
@@ -293,12 +296,21 @@ create or replace package body PKG_P8PANELS_SAMPLES as
BORDER => true,
BFILTER => true,
SPARENT => 'SAGNINFO',
+ NWIDTH => 100,
RCOL_VALS => RAGN_TYPES,
SHINT => 'В Системе бывают контрагенты двух типов: ' ||
'Юридическое лицо - организация, которая имеет в собственности, хозяйственном ведении ' ||
'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' ||
'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям. ' ||
'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.');
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SFULLNAME',
+ SCAPTION => 'Полное наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SAGNIDNUMB',
+ SCAPTION => 'ИНН',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
/* Обходим данные */
begin
/* Добавляем подсказку совместимости */
@@ -309,7 +321,9 @@ create or replace package body PKG_P8PANELS_SAMPLES as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select AG.AGNABBR SAGNABBR,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNNAME SAGNNAME,');
- PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNTYPE NAGNTYPE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNTYPE NAGNTYPE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.FULLNAME SFULLNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNIDNUMB SAGNIDNUMB');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from AGNLIST AG');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
@@ -341,7 +355,9 @@ 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);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -374,6 +390,8 @@ create or replace package body PKG_P8PANELS_SAMPLES as
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNINFO', SVALUE => SAGNINFO);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNNAME', SVALUE => SAGNNAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NAGNTYPE', NVALUE => NAGNTYPE);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SFULLNAME', ICURSOR => ICURSOR, NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNIDNUMB', ICURSOR => ICURSOR, NPOSITION => 5);
/* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop;
diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck
index cfb03c3..c1580f2 100644
--- a/db/PKG_P8PANELS_VISUAL.pck
+++ b/db/PKG_P8PANELS_VISUAL.pck
@@ -54,7 +54,8 @@ create or replace package PKG_P8PANELS_VISUAL as
SHINT PKG_STD.TSTRING, -- Текст всплывающей подсказки
SPARENT PKG_STD.TSTRING, -- Наименование родительской колонки
BEXPANDABLE boolean, -- Разрешить сокрытие/отображение дочерних колонок
- BEXPANDED boolean -- Отобразить/скрыть дочерние колонки
+ BEXPANDED boolean, -- Отобразить/скрыть дочерние колонки
+ NWIDTH PKG_STD.TNUMBER -- Ширина колонки (обязательно для фиксированных)
);
/* Типы данных - коллекция описателей колонок таблицы данных */
@@ -95,9 +96,11 @@ create or replace package PKG_P8PANELS_VISUAL as
/* Типы данных - таблица данных */
type TDATA_GRID is record
(
- RCOL_DEFS TCOL_DEFS, -- Описание колонок
- RGROUPS TGROUPS, -- Описание групп
- RROWS TROWS -- Данные строк
+ BFIXED_HEADER boolean, -- Зафиксировать заголовок
+ NFIXED_COLUMNS PKG_STD.TNUMBER, -- Количество фиксированных колонок
+ RCOL_DEFS TCOL_DEFS, -- Описание колонок
+ RGROUPS TGROUPS, -- Описание групп
+ RROWS TROWS -- Данные строк
);
/* Типы данных - фильтр */
@@ -319,7 +322,10 @@ create or replace package PKG_P8PANELS_VISUAL as
/* Формирование таблицы данных */
function TDATA_GRID_MAKE
- return TDATA_GRID; -- Результат работы
+ (
+ BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок
+ NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок
+ ) return TDATA_GRID; -- Результат работы
/* Поиск описания колонки в таблице данных по наименованию */
function TDATA_GRID_FIND_COL_DEF
@@ -345,6 +351,7 @@ create or replace package PKG_P8PANELS_VISUAL as
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
+ NWIDTH in number := null, -- Ширина колонки (обязательно для фиксированных)
BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
@@ -595,27 +602,31 @@ text="Формат data_grid и gant как в chart"
SRESP_TAG_XGANTT_DEF constant PKG_STD.TSTRING := 'XGANTT_DEF'; -- Тэг для описания заголовка диаграммы Ганта
SRESP_TAG_XGANTT_TASKS constant PKG_STD.TSTRING := 'XGANTT_TASKS'; -- Тэг для описания коллекции задач диаграммы Ганта
SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика
+ SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных
/* Константы - атрибуты ответов (универсальные) */
- SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования
- SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи
- SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных
- SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости
- SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка
- SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба
- SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора
- SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала
- SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания
- SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера
- SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера
- SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования
- SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания
- SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа
- SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки
- SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы
- SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя
- SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения
- SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения
+ SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования
+ SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи
+ SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных
+ SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости
+ SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка
+ SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба
+ SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора
+ SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала
+ SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания
+ SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера
+ SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера
+ SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования
+ SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания
+ SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа
+ SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки
+ SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы
+ SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя
+ SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения
+ SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения
+ SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка
+ SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок
+ SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины
/* Константы - атрибуты ответов (таблица данных) */
SRESP_ATTR_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки
@@ -743,7 +754,8 @@ text="Формат data_grid и gant как в chart"
SHINT in varchar2 := null, -- Текст всплывающей подсказки
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
- BEXPANDED in boolean := true -- Отобразить/скрыть дочерние колонки
+ BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
+ NWIDTH in number := null -- Ширина колонки (обязательно для фиксированных)
) return TCOL_DEF -- Результат работы
is
RRES TCOL_DEF; -- Буфер для результата
@@ -762,6 +774,7 @@ text="Формат data_grid и gant как в chart"
RRES.SPARENT := SPARENT;
RRES.BEXPANDABLE := COALESCE(BEXPANDABLE, false);
RRES.BEXPANDED := COALESCE(BEXPANDED, true);
+ RRES.NWIDTH := NWIDTH;
/* Возвращаем результат */
return RRES;
end TCOL_DEF_MAKE;
@@ -783,6 +796,7 @@ text="Формат data_grid и gant как в chart"
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
+ NWIDTH in number := null, -- Ширина колонки (обязательно для фиксированных)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
@@ -805,7 +819,8 @@ text="Формат data_grid и gant как в chart"
SHINT => SHINT,
SPARENT => SPARENT,
BEXPANDABLE => BEXPANDABLE,
- BEXPANDED => BEXPANDED);
+ BEXPANDED => BEXPANDED,
+ NWIDTH => NWIDTH);
end TCOL_DEFS_ADD;
/* Поиск описания колонки по наименованию */
@@ -853,6 +868,9 @@ text="Формат data_grid и gant как в chart"
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_PARENT, SVALUE => RCOL_DEFS(I).SPARENT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDABLE, BVALUE => RCOL_DEFS(I).BEXPANDABLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDED, BVALUE => RCOL_DEFS(I).BEXPANDED);
+ if (RCOL_DEFS(I).NWIDTH is not null) then
+ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_WIDTH, NVALUE => RCOL_DEFS(I).NWIDTH);
+ end if;
/* Предопределённые значения */
if (RCOL_DEFS(I).RCOL_VALS is not null) and (RCOL_DEFS(I).RCOL_VALS.COUNT > 0) then
for V in RCOL_DEFS(I).RCOL_VALS.FIRST .. RCOL_DEFS(I).RCOL_VALS.LAST
@@ -1148,14 +1166,19 @@ text="Формат data_grid и gant как в chart"
/* Формирование таблицы данных */
function TDATA_GRID_MAKE
- return TDATA_GRID -- Результат работы
+ (
+ BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок
+ NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок
+ ) return TDATA_GRID -- Результат работы
is
- RRES TDATA_GRID; -- Буфер для результата
+ RRES TDATA_GRID; -- Буфер для результата
begin
/* Формируем объект */
- RRES.RCOL_DEFS := TCOL_DEFS();
- RRES.RGROUPS := TGROUPS();
- RRES.RROWS := TROWS();
+ RRES.BFIXED_HEADER := COALESCE(BFIXED_HEADER, false);
+ RRES.NFIXED_COLUMNS := COALESCE(NFIXED_COLUMNS, 0);
+ RRES.RCOL_DEFS := TCOL_DEFS();
+ RRES.RGROUPS := TGROUPS();
+ RRES.RROWS := TROWS();
/* Возвращаем результат */
return RRES;
end TDATA_GRID_MAKE;
@@ -1188,6 +1211,7 @@ text="Формат data_grid и gant как в chart"
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
+ NWIDTH in number := null, -- Ширина колонки (обязательно для фиксированных)
BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
@@ -1207,6 +1231,7 @@ text="Формат data_grid и gant как в chart"
SPARENT => SPARENT,
BEXPANDABLE => BEXPANDABLE,
BEXPANDED => BEXPANDED,
+ NWIDTH => NWIDTH,
BCLEAR => BCLEAR);
end TDATA_GRID_ADD_COL_DEF;
@@ -1249,6 +1274,18 @@ text="Формат data_grid и gant как в chart"
RDATA_GRID.RROWS(RDATA_GRID.RROWS.LAST) := RROW;
end TDATA_GRID_ADD_ROW;
+ /* Сериализация описания таблицы данных */
+ procedure TDATA_GRID_DEF_TO_XML
+ (
+ RDATA_GRID in TDATA_GRID -- Описание таблицы данных
+ )
+ is
+ begin
+ /* Cтатические атрибуты заголовка */
+ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_HEADER, BVALUE => RDATA_GRID.BFIXED_HEADER);
+ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_COLUMNS, NVALUE => RDATA_GRID.NFIXED_COLUMNS);
+ end TDATA_GRID_DEF_TO_XML;
+
/* Сериализация таблицы данных */
function TDATA_GRID_TO_XML
(
@@ -1262,6 +1299,12 @@ text="Формат data_grid и gant как в chart"
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
+ /* Открываем таблицу данных */
+ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA_GRID);
+ /* Формируем описание таблицы данных */
+ TDATA_GRID_DEF_TO_XML(RDATA_GRID => RDATA_GRID);
+ /* Закрываем таблицу данных */
+ PKG_XFAST.UP();
/* Если необходимо включить описание колонок */
if (NINCLUDE_DEF = 1) then
TCOL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS);
diff --git a/dist/p8-panels.js b/dist/p8-panels.js
index d7cd438..b51857f 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\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.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/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.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_fact_rpt_dtl\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl.js\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.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/layouts\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/layouts.js\": \"./app/panels/prj_jobs/layouts.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\"./mech_rec_assembly_mon\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/components/plan_detail\": \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\",\n\t\"./mech_rec_assembly_mon/components/plan_detail.js\": \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list\": \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list.js\": \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list_item\": \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list_item.js\": \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.js\",\n\t\"./mech_rec_assembly_mon/components/progress_box\": \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\",\n\t\"./mech_rec_assembly_mon/components/progress_box.js\": \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\",\n\t\"./mech_rec_assembly_mon/hooks\": \"./app/panels/mech_rec_assembly_mon/hooks.js\",\n\t\"./mech_rec_assembly_mon/hooks.js\": \"./app/panels/mech_rec_assembly_mon/hooks.js\",\n\t\"./mech_rec_assembly_mon/index\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/index.js\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/mech_rec_assembly_mon\": \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\",\n\t\"./mech_rec_assembly_mon/mech_rec_assembly_mon.js\": \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\",\n\t\"./mech_rec_assembly_mon/styles/themes\": \"./app/panels/mech_rec_assembly_mon/styles/themes.js\",\n\t\"./mech_rec_assembly_mon/styles/themes.js\": \"./app/panels/mech_rec_assembly_mon/styles/themes.js\",\n\t\"./mech_rec_cost_jobs_manage\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/backend\": \"./app/panels/mech_rec_cost_jobs_manage/backend.js\",\n\t\"./mech_rec_cost_jobs_manage/backend.js\": \"./app/panels/mech_rec_cost_jobs_manage/backend.js\",\n\t\"./mech_rec_cost_jobs_manage/fcjobssp\": \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\",\n\t\"./mech_rec_cost_jobs_manage/fcjobssp.js\": \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\",\n\t\"./mech_rec_cost_jobs_manage/hooks\": \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\",\n\t\"./mech_rec_cost_jobs_manage/hooks.js\": \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\",\n\t\"./mech_rec_cost_jobs_manage/index\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/index.js\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage\": \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\",\n\t\"./mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\": \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.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/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.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\"./mech_rec_dept_cost_jobs\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/index\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/index.js\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs\": \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\",\n\t\"./mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\": \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\",\n\t\"./mech_rec_dept_cost_prod_plans\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlst\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlst.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstsp\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstsp.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js\",\n\t\"./mech_rec_dept_cost_prod_plans/hooks\": \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_dept_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_dept_cost_prod_plans/incomefromdeps\": \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\",\n\t\"./mech_rec_dept_cost_prod_plans/incomefromdeps.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\",\n\t\"./mech_rec_dept_cost_prod_plans/index\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/index.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans\": \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\",\n\t\"./mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_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_fact_rpt_dtl\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl.js\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.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/layouts\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/layouts.js\": \"./app/panels/prj_jobs/layouts.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\"./rrp_conf_editor\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/custom_dialog\": \"./app/panels/rrp_conf_editor/custom_dialog.js\",\n\t\"./rrp_conf_editor/custom_dialog.js\": \"./app/panels/rrp_conf_editor/custom_dialog.js\",\n\t\"./rrp_conf_editor/custom_form_control\": \"./app/panels/rrp_conf_editor/custom_form_control.js\",\n\t\"./rrp_conf_editor/custom_form_control.js\": \"./app/panels/rrp_conf_editor/custom_form_control.js\",\n\t\"./rrp_conf_editor/custom_tab_panel\": \"./app/panels/rrp_conf_editor/custom_tab_panel.js\",\n\t\"./rrp_conf_editor/custom_tab_panel.js\": \"./app/panels/rrp_conf_editor/custom_tab_panel.js\",\n\t\"./rrp_conf_editor/index\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/index.js\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/layouts\": \"./app/panels/rrp_conf_editor/layouts.js\",\n\t\"./rrp_conf_editor/layouts.js\": \"./app/panels/rrp_conf_editor/layouts.js\",\n\t\"./rrp_conf_editor/rrp_conf_editor\": \"./app/panels/rrp_conf_editor/rrp_conf_editor.js\",\n\t\"./rrp_conf_editor/rrp_conf_editor.js\": \"./app/panels/rrp_conf_editor/rrp_conf_editor.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\t\"./samples/svg\": \"./app/panels/samples/svg.js\",\n\t\"./samples/svg.js\": \"./app/panels/samples/svg.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_^\\.\\/.*$?");
/***/ }),
@@ -679,6 +679,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/material/CircularProgress/CircularProgress.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@mui/material/CircularProgress/CircularProgress.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_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/chainPropTypes/chainPropTypes.js\");\n/* harmony import */ var _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_system__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/system */ \"./node_modules/@emotion/react/dist/emotion-react.browser.esm.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __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_9__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var _circularProgressClasses__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./circularProgressClasses */ \"./node_modules/@mui/material/CircularProgress/circularProgressClasses.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\", \"color\", \"disableShrink\", \"size\", \"style\", \"thickness\", \"value\", \"variant\"];\nlet _ = t => t,\n _t,\n _t2,\n _t3,\n _t4;\n\n\n\n\n\n\n\n\n\n\n\nconst SIZE = 44;\nconst circularRotateKeyframe = (0,_mui_system__WEBPACK_IMPORTED_MODULE_5__.keyframes)(_t || (_t = _`\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n`));\nconst circularDashKeyframe = (0,_mui_system__WEBPACK_IMPORTED_MODULE_5__.keyframes)(_t2 || (_t2 = _`\n 0% {\n stroke-dasharray: 1px, 200px;\n stroke-dashoffset: 0;\n }\n\n 50% {\n stroke-dasharray: 100px, 200px;\n stroke-dashoffset: -15px;\n }\n\n 100% {\n stroke-dasharray: 100px, 200px;\n stroke-dashoffset: -125px;\n }\n`));\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n variant,\n color,\n disableShrink\n } = ownerState;\n const slots = {\n root: ['root', variant, `color${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color)}`],\n svg: ['svg'],\n circle: ['circle', `circle${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(variant)}`, disableShrink && 'circleDisableShrink']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(slots, _circularProgressClasses__WEBPACK_IMPORTED_MODULE_8__.getCircularProgressUtilityClass, classes);\n};\nconst CircularProgressRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_9__[\"default\"])('span', {\n name: 'MuiCircularProgress',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, styles[ownerState.variant], styles[`color${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(ownerState.color)}`]];\n }\n})(({\n ownerState,\n theme\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'inline-block'\n}, ownerState.variant === 'determinate' && {\n transition: theme.transitions.create('transform')\n}, ownerState.color !== 'inherit' && {\n color: (theme.vars || theme).palette[ownerState.color].main\n}), ({\n ownerState\n}) => ownerState.variant === 'indeterminate' && (0,_mui_system__WEBPACK_IMPORTED_MODULE_5__.css)(_t3 || (_t3 = _`\n animation: ${0} 1.4s linear infinite;\n `), circularRotateKeyframe));\nconst CircularProgressSVG = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_9__[\"default\"])('svg', {\n name: 'MuiCircularProgress',\n slot: 'Svg',\n overridesResolver: (props, styles) => styles.svg\n})({\n display: 'block' // Keeps the progress centered\n});\n\nconst CircularProgressCircle = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_9__[\"default\"])('circle', {\n name: 'MuiCircularProgress',\n slot: 'Circle',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.circle, styles[`circle${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(ownerState.variant)}`], ownerState.disableShrink && styles.circleDisableShrink];\n }\n})(({\n ownerState,\n theme\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n stroke: 'currentColor'\n}, ownerState.variant === 'determinate' && {\n transition: theme.transitions.create('stroke-dashoffset')\n}, ownerState.variant === 'indeterminate' && {\n // Some default value that looks fine waiting for the animation to kicks in.\n strokeDasharray: '80px, 200px',\n strokeDashoffset: 0 // Add the unit to fix a Edge 16 and below bug.\n}), ({\n ownerState\n}) => ownerState.variant === 'indeterminate' && !ownerState.disableShrink && (0,_mui_system__WEBPACK_IMPORTED_MODULE_5__.css)(_t4 || (_t4 = _`\n animation: ${0} 1.4s ease-in-out infinite;\n `), circularDashKeyframe));\n\n/**\n * ## ARIA\n *\n * If the progress bar is describing the loading progress of a particular region of a page,\n * you should use `aria-describedby` to point to the progress bar, and set the `aria-busy`\n * attribute to `true` on that region until it has finished loading.\n */\nconst CircularProgress = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function CircularProgress(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_10__[\"default\"])({\n props: inProps,\n name: 'MuiCircularProgress'\n });\n const {\n className,\n color = 'primary',\n disableShrink = false,\n size = 40,\n style,\n thickness = 3.6,\n value = 0,\n variant = 'indeterminate'\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 color,\n disableShrink,\n size,\n thickness,\n value,\n variant\n });\n const classes = useUtilityClasses(ownerState);\n const circleStyle = {};\n const rootStyle = {};\n const rootProps = {};\n if (variant === 'determinate') {\n const circumference = 2 * Math.PI * ((SIZE - thickness) / 2);\n circleStyle.strokeDasharray = circumference.toFixed(3);\n rootProps['aria-valuenow'] = Math.round(value);\n circleStyle.strokeDashoffset = `${((100 - value) / 100 * circumference).toFixed(3)}px`;\n rootStyle.transform = 'rotate(-90deg)';\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(CircularProgressRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className),\n style: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n width: size,\n height: size\n }, rootStyle, style),\n ownerState: ownerState,\n ref: ref,\n role: \"progressbar\"\n }, rootProps, other, {\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(CircularProgressSVG, {\n className: classes.svg,\n ownerState: ownerState,\n viewBox: `${SIZE / 2} ${SIZE / 2} ${SIZE} ${SIZE}`,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(CircularProgressCircle, {\n className: classes.circle,\n style: circleStyle,\n ownerState: ownerState,\n cx: SIZE,\n cy: SIZE,\n r: (SIZE - thickness) / 2,\n fill: \"none\",\n strokeWidth: thickness\n })\n })\n }));\n});\n true ? CircularProgress.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 * 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 * 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_11___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_11___default().oneOf(['inherit', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string)]),\n /**\n * If `true`, the shrink animation is disabled.\n * This only works if variant is `indeterminate`.\n * @default false\n */\n disableShrink: (0,_mui_utils__WEBPACK_IMPORTED_MODULE_12__[\"default\"])((prop_types__WEBPACK_IMPORTED_MODULE_11___default().bool), props => {\n if (props.disableShrink && props.variant && props.variant !== 'indeterminate') {\n return new Error('MUI: You have provided the `disableShrink` prop ' + 'with a variant other than `indeterminate`. This will have no effect.');\n }\n return null;\n }),\n /**\n * The size of the component.\n * If using a number, the pixel unit is assumed.\n * If using a string, you need to provide the CSS unit, e.g '3rem'.\n * @default 40\n */\n size: prop_types__WEBPACK_IMPORTED_MODULE_11___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_11___default().number), (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string)]),\n /**\n * @ignore\n */\n style: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().object),\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 /**\n * The thickness of the circle.\n * @default 3.6\n */\n thickness: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number),\n /**\n * The value of the progress indicator for the determinate variant.\n * Value between 0 and 100.\n * @default 0\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number),\n /**\n * The variant to use.\n * Use indeterminate when there is no progress value.\n * @default 'indeterminate'\n */\n variant: prop_types__WEBPACK_IMPORTED_MODULE_11___default().oneOf(['determinate', 'indeterminate'])\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CircularProgress);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/CircularProgress/CircularProgress.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/CircularProgress/circularProgressClasses.js":
+/*!********************************************************************************!*\
+ !*** ./node_modules/@mui/material/CircularProgress/circularProgressClasses.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 */ getCircularProgressUtilityClass: () => (/* binding */ getCircularProgressUtilityClass)\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 getCircularProgressUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiCircularProgress', slot);\n}\nconst circularProgressClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiCircularProgress', ['root', 'determinate', 'indeterminate', 'colorPrimary', 'colorSecondary', 'svg', 'circle', 'circleDeterminate', 'circleIndeterminate', 'circleDisableShrink']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (circularProgressClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/CircularProgress/circularProgressClasses.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/Container/Container.js":
/*!***********************************************************!*\
!*** ./node_modules/@mui/material/Container/Container.js ***!
@@ -1163,6 +1185,61 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/material/ImageListItem/ImageListItem.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@mui/material/ImageListItem/ImageListItem.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 _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_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/integerPropType.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\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 react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-is */ \"./node_modules/@mui/material/node_modules/react-is/index.js\");\n/* harmony import */ var _ImageList_ImageListContext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ImageList/ImageListContext */ \"./node_modules/@mui/material/ImageList/ImageListContext.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 _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./node_modules/@mui/material/utils/isMuiElement.js\");\n/* harmony import */ var _imageListItemClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./imageListItemClasses */ \"./node_modules/@mui/material/ImageListItem/imageListItemClasses.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 = [\"children\", \"className\", \"cols\", \"component\", \"rows\", \"style\"];\n\n\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n variant\n } = ownerState;\n const slots = {\n root: ['root', variant],\n img: ['img']\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _imageListItemClasses__WEBPACK_IMPORTED_MODULE_7__.getImageListItemUtilityClass, classes);\n};\nconst ImageListItemRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"])('li', {\n name: 'MuiImageListItem',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [{\n [`& .${_imageListItemClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].img}`]: styles.img\n }, styles.root, styles[ownerState.variant]];\n }\n})(({\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'block',\n position: 'relative'\n}, ownerState.variant === 'standard' && {\n // For titlebar under list item\n display: 'flex',\n flexDirection: 'column'\n}, ownerState.variant === 'woven' && {\n height: '100%',\n alignSelf: 'center',\n '&:nth-of-type(even)': {\n height: '70%'\n }\n}, {\n [`& .${_imageListItemClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].img}`]: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n objectFit: 'cover',\n width: '100%',\n height: '100%',\n display: 'block'\n }, ownerState.variant === 'standard' && {\n height: 'auto',\n flexGrow: 1\n })\n}));\nconst ImageListItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.forwardRef(function ImageListItem(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_9__[\"default\"])({\n props: inProps,\n name: 'MuiImageListItem'\n });\n\n // TODO: - Use jsdoc @default?: \"cols rows default values are for docs only\"\n const {\n children,\n className,\n cols = 1,\n component = 'li',\n rows = 1,\n style\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const {\n rowHeight = 'auto',\n gap,\n variant\n } = react__WEBPACK_IMPORTED_MODULE_3__.useContext(_ImageList_ImageListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\n let height = 'auto';\n if (variant === 'woven') {\n height = undefined;\n } else if (rowHeight !== 'auto') {\n height = rowHeight * rows + gap * (rows - 1);\n }\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n cols,\n component,\n gap,\n rowHeight,\n rows,\n variant\n });\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(ImageListItemRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n as: component,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.root, classes[variant], className),\n ref: ref,\n style: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n height,\n gridColumnEnd: variant !== 'masonry' ? `span ${cols}` : undefined,\n gridRowEnd: variant !== 'masonry' ? `span ${rows}` : undefined,\n marginBottom: variant === 'masonry' ? gap : undefined\n }, style),\n ownerState: ownerState\n }, other, {\n children: react__WEBPACK_IMPORTED_MODULE_3__.Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.isValidElement(child)) {\n return null;\n }\n if (true) {\n if ((0,react_is__WEBPACK_IMPORTED_MODULE_4__.isFragment)(child)) {\n console.error([\"MUI: The ImageListItem component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n }\n }\n if (child.type === 'img' || (0,_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(child, ['Image'])) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.cloneElement(child, {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.img, child.props.className)\n });\n }\n return child;\n })\n }));\n});\n true ? ImageListItem.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, normally an ` `.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().node),\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 * Width of the item in number of grid columns.\n * @default 1\n */\n cols: _mui_utils__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\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_12___default().elementType),\n /**\n * Height of the item in number of grid rows.\n * @default 1\n */\n rows: _mui_utils__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n /**\n * @ignore\n */\n style: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().object),\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} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ImageListItem);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/ImageListItem/ImageListItem.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/ImageListItem/imageListItemClasses.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@mui/material/ImageListItem/imageListItemClasses.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 */ getImageListItemUtilityClass: () => (/* binding */ getImageListItemUtilityClass)\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 getImageListItemUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiImageListItem', slot);\n}\nconst imageListItemClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiImageListItem', ['root', 'img', 'standard', 'woven', 'masonry', 'quilted']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (imageListItemClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/ImageListItem/imageListItemClasses.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/ImageList/ImageList.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/@mui/material/ImageList/ImageList.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 _mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/base/composeClasses */ \"./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/integerPropType.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"./node_modules/clsx/dist/clsx.mjs\");\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 react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\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 _imageListClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./imageListClasses */ \"./node_modules/@mui/material/ImageList/imageListClasses.js\");\n/* harmony import */ var _ImageListContext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ImageListContext */ \"./node_modules/@mui/material/ImageList/ImageListContext.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 = [\"children\", \"className\", \"cols\", \"component\", \"rowHeight\", \"gap\", \"style\", \"variant\"];\n\n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = ownerState => {\n const {\n classes,\n variant\n } = ownerState;\n const slots = {\n root: ['root', variant]\n };\n return (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(slots, _imageListClasses__WEBPACK_IMPORTED_MODULE_6__.getImageListUtilityClass, classes);\n};\nconst ImageListRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])('ul', {\n name: 'MuiImageList',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, styles[ownerState.variant]];\n }\n})(({\n ownerState\n}) => {\n return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n display: 'grid',\n overflowY: 'auto',\n listStyle: 'none',\n padding: 0,\n // Add iOS momentum scrolling for iOS < 13.0\n WebkitOverflowScrolling: 'touch'\n }, ownerState.variant === 'masonry' && {\n display: 'block'\n });\n});\nconst ImageList = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.forwardRef(function ImageList(inProps, ref) {\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_8__[\"default\"])({\n props: inProps,\n name: 'MuiImageList'\n });\n const {\n children,\n className,\n cols = 2,\n component = 'ul',\n rowHeight = 'auto',\n gap = 4,\n style: styleProp,\n variant = 'standard'\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, _excluded);\n const contextValue = react__WEBPACK_IMPORTED_MODULE_3__.useMemo(() => ({\n rowHeight,\n gap,\n variant\n }), [rowHeight, gap, variant]);\n react__WEBPACK_IMPORTED_MODULE_3__.useEffect(() => {\n if (true) {\n // Detect Internet Explorer 8+\n if (document !== undefined && 'objectFit' in document.documentElement.style === false) {\n console.error(['MUI: ImageList v5+ no longer natively supports Internet Explorer.', 'Use v4 of this component instead, or polyfill CSS object-fit.'].join('\\n'));\n }\n }\n }, []);\n const style = variant === 'masonry' ? (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n columnCount: cols,\n columnGap: gap\n }, styleProp) : (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap\n }, styleProp);\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, props, {\n component,\n gap,\n rowHeight,\n variant\n });\n const classes = useUtilityClasses(ownerState);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(ImageListRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n as: component,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.root, classes[variant], className),\n ref: ref,\n style: style,\n ownerState: ownerState\n }, other, {\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_ImageListContext__WEBPACK_IMPORTED_MODULE_9__[\"default\"].Provider, {\n value: contextValue,\n children: children\n })\n }));\n});\n true ? ImageList.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, normally `ImageListItem`s.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().node).isRequired,\n /**\n * Override or extend the styles applied to the component.\n */\n classes: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object),\n /**\n * @ignore\n */\n className: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string),\n /**\n * Number of columns.\n * @default 2\n */\n cols: _mui_utils__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\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_10___default().elementType),\n /**\n * The gap between items in px.\n * @default 4\n */\n gap: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number),\n /**\n * The height of one row in px.\n * @default 'auto'\n */\n rowHeight: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOf(['auto']), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number)]),\n /**\n * @ignore\n */\n style: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object),\n /**\n * The system prop that allows defining system overrides as well as additional CSS styles.\n */\n sx: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().bool)])), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object)]),\n /**\n * The variant to use.\n * @default 'standard'\n */\n variant: prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_10___default().oneOf(['masonry', 'quilted', 'standard', 'woven']), (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string)])\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ImageList);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/ImageList/ImageList.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/ImageList/ImageListContext.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@mui/material/ImageList/ImageListContext.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'use client';\n\n\n\n/**\n * @ignore - internal component.\n * @type {React.Context<{} | {expanded: boolean, disabled: boolean, toggle: () => void}>}\n */\nconst ImageListContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext({});\nif (true) {\n ImageListContext.displayName = 'ImageListContext';\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ImageListContext);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/ImageList/ImageListContext.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/ImageList/imageListClasses.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@mui/material/ImageList/imageListClasses.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 */ getImageListUtilityClass: () => (/* binding */ getImageListUtilityClass)\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 getImageListUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiImageList', slot);\n}\nconst imageListClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiImageList', ['root', 'masonry', 'quilted', 'standard', 'woven']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (imageListClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/ImageList/imageListClasses.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/InputAdornment/InputAdornment.js":
/*!*********************************************************************!*\
!*** ./node_modules/@mui/material/InputAdornment/InputAdornment.js ***!
@@ -1625,6 +1702,72 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/material/RadioGroup/RadioGroup.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/@mui/material/RadioGroup/RadioGroup.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_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_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 _FormGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormGroup */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./node_modules/@mui/material/utils/useForkRef.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/useControlled */ \"./node_modules/@mui/material/utils/useControlled.js\");\n/* harmony import */ var _RadioGroupContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./RadioGroupContext */ \"./node_modules/@mui/material/RadioGroup/RadioGroupContext.js\");\n/* harmony import */ var _utils_useId__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/useId */ \"./node_modules/@mui/material/utils/useId.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 = [\"actions\", \"children\", \"defaultValue\", \"name\", \"onChange\", \"value\"];\n\n\n\n\n\n\n\n\nconst RadioGroup = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function RadioGroup(props, ref) {\n const {\n // private\n // eslint-disable-next-line react/prop-types\n actions,\n children,\n defaultValue,\n name: nameProp,\n onChange,\n value: valueProp\n } = props,\n other = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, _excluded);\n const rootRef = react__WEBPACK_IMPORTED_MODULE_2__.useRef(null);\n const [value, setValueState] = (0,_utils_useControlled__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n controlled: valueProp,\n default: defaultValue,\n name: 'RadioGroup'\n });\n react__WEBPACK_IMPORTED_MODULE_2__.useImperativeHandle(actions, () => ({\n focus: () => {\n let input = rootRef.current.querySelector('input:not(:disabled):checked');\n if (!input) {\n input = rootRef.current.querySelector('input:not(:disabled)');\n }\n if (input) {\n input.focus();\n }\n }\n }), []);\n const handleRef = (0,_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ref, rootRef);\n const name = (0,_utils_useId__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(nameProp);\n const contextValue = react__WEBPACK_IMPORTED_MODULE_2__.useMemo(() => ({\n name,\n onChange(event) {\n setValueState(event.target.value);\n if (onChange) {\n onChange(event, event.target.value);\n }\n },\n value\n }), [name, onChange, setValueState, value]);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_RadioGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n value: contextValue,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_FormGroup__WEBPACK_IMPORTED_MODULE_8__[\"default\"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n role: \"radiogroup\",\n ref: handleRef\n }, other, {\n children: children\n }))\n });\n});\n true ? RadioGroup.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_9___default().node),\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().any),\n /**\n * The name used to reference the value of the control.\n * If you don't provide this prop, it falls back to a randomly generated name.\n */\n name: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string),\n /**\n * Callback fired when a radio button is selected.\n *\n * @param {React.ChangeEvent} event The event source of the callback.\n * @param {string} value The value of the selected radio button.\n * You can pull out the new value by accessing `event.target.value` (string).\n */\n onChange: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n /**\n * Value of the selected radio button. The DOM API casts this to a string.\n */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().any)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RadioGroup);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/RadioGroup/RadioGroup.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/RadioGroup/RadioGroupContext.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@mui/material/RadioGroup/RadioGroupContext.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\n/**\n * @ignore - internal component.\n */\nconst RadioGroupContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext(undefined);\nif (true) {\n RadioGroupContext.displayName = 'RadioGroupContext';\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RadioGroupContext);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/RadioGroup/RadioGroupContext.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/RadioGroup/useRadioGroup.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/@mui/material/RadioGroup/useRadioGroup.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 */ useRadioGroup)\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 _RadioGroupContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RadioGroupContext */ \"./node_modules/@mui/material/RadioGroup/RadioGroupContext.js\");\n'use client';\n\n\n\nfunction useRadioGroup() {\n return react__WEBPACK_IMPORTED_MODULE_0__.useContext(_RadioGroupContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n}\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/RadioGroup/useRadioGroup.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/Radio/Radio.js":
+/*!***************************************************!*\
+ !*** ./node_modules/@mui/material/Radio/Radio.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 _styles_useThemeProps__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/useThemeProps */ \"./node_modules/@mui/material/styles/useThemeProps.js\");\n/* harmony import */ var _RadioButtonIcon__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./RadioButtonIcon */ \"./node_modules/@mui/material/Radio/RadioButtonIcon.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 _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./node_modules/@mui/material/utils/createChainedFunction.js\");\n/* harmony import */ var _RadioGroup_useRadioGroup__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../RadioGroup/useRadioGroup */ \"./node_modules/@mui/material/RadioGroup/useRadioGroup.js\");\n/* harmony import */ var _radioClasses__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./radioClasses */ \"./node_modules/@mui/material/Radio/radioClasses.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 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\", \"checkedIcon\", \"color\", \"icon\", \"name\", \"onChange\", \"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 color\n } = ownerState;\n const slots = {\n root: ['root', `color${(0,_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(color)}`]\n };\n return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, classes, (0,_mui_base_composeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(slots, _radioClasses__WEBPACK_IMPORTED_MODULE_7__.getRadioUtilityClass, classes));\n};\nconst RadioRoot = (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: 'MuiRadio',\n slot: 'Root',\n overridesResolver: (props, styles) => {\n const {\n ownerState\n } = props;\n return [styles.root, 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[ownerState.color].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 [`&.${_radioClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].checked}`]: {\n color: (theme.vars || theme).palette[ownerState.color].main\n }\n}, {\n [`&.${_radioClasses__WEBPACK_IMPORTED_MODULE_7__[\"default\"].disabled}`]: {\n color: (theme.vars || theme).palette.action.disabled\n }\n}));\nfunction areEqualValues(a, b) {\n if (typeof b === 'object' && b !== null) {\n return a === b;\n }\n\n // The value could be a number, the DOM will stringify it anyway.\n return String(a) === String(b);\n}\nconst defaultCheckedIcon = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_RadioButtonIcon__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n checked: true\n});\nconst defaultIcon = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_RadioButtonIcon__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {});\nconst Radio = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.forwardRef(function Radio(inProps, ref) {\n var _defaultIcon$props$fo, _defaultCheckedIcon$p;\n const props = (0,_styles_useThemeProps__WEBPACK_IMPORTED_MODULE_12__[\"default\"])({\n props: inProps,\n name: 'MuiRadio'\n });\n const {\n checked: checkedProp,\n checkedIcon = defaultCheckedIcon,\n color = 'primary',\n icon = defaultIcon,\n name: nameProp,\n onChange: onChangeProp,\n size = 'medium',\n className\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 color,\n size\n });\n const classes = useUtilityClasses(ownerState);\n const radioGroup = (0,_RadioGroup_useRadioGroup__WEBPACK_IMPORTED_MODULE_13__[\"default\"])();\n let checked = checkedProp;\n const onChange = (0,_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_14__[\"default\"])(onChangeProp, radioGroup && radioGroup.onChange);\n let name = nameProp;\n if (radioGroup) {\n if (typeof checked === 'undefined') {\n checked = areEqualValues(radioGroup.value, props.value);\n }\n if (typeof name === 'undefined') {\n name = radioGroup.name;\n }\n }\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(RadioRoot, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n type: \"radio\",\n icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(icon, {\n fontSize: (_defaultIcon$props$fo = defaultIcon.props.fontSize) != null ? _defaultIcon$props$fo : size\n }),\n checkedIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.cloneElement(checkedIcon, {\n fontSize: (_defaultCheckedIcon$p = defaultCheckedIcon.props.fontSize) != null ? _defaultCheckedIcon$p : size\n }),\n ownerState: ownerState,\n classes: classes,\n name: name,\n checked: checked,\n onChange: onChange,\n ref: ref,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, className)\n }, other));\n});\n true ? Radio.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 * If `true`, the component is disabled.\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 * [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 * Name attribute of the `input` element.\n */\n name: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string),\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 value by accessing `event.target.value` (string).\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 radio 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 */\n value: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().any)\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Radio);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Radio/Radio.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/Radio/RadioButtonIcon.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/@mui/material/Radio/RadioButtonIcon.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_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\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 _internal_svg_icons_RadioButtonUnchecked__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../internal/svg-icons/RadioButtonUnchecked */ \"./node_modules/@mui/material/internal/svg-icons/RadioButtonUnchecked.js\");\n/* harmony import */ var _internal_svg_icons_RadioButtonChecked__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../internal/svg-icons/RadioButtonChecked */ \"./node_modules/@mui/material/internal/svg-icons/RadioButtonChecked.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/styled */ \"./node_modules/@mui/material/styles/styled.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n\n\n\n\n\nconst RadioButtonIconRoot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_3__[\"default\"])('span')({\n position: 'relative',\n display: 'flex'\n});\nconst RadioButtonIconBackground = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_internal_svg_icons_RadioButtonUnchecked__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n // Scale applied to prevent dot misalignment in Safari\n transform: 'scale(1)'\n});\nconst RadioButtonIconDot = (0,_styles_styled__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_internal_svg_icons_RadioButtonChecked__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(({\n theme,\n ownerState\n}) => (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n left: 0,\n position: 'absolute',\n transform: 'scale(0)',\n transition: theme.transitions.create('transform', {\n easing: theme.transitions.easing.easeIn,\n duration: theme.transitions.duration.shortest\n })\n}, ownerState.checked && {\n transform: 'scale(1)',\n transition: theme.transitions.create('transform', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shortest\n })\n}));\n\n/**\n * @ignore - internal component.\n */\nfunction RadioButtonIcon(props) {\n const {\n checked = false,\n classes = {},\n fontSize\n } = props;\n const ownerState = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, props, {\n checked\n });\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)(RadioButtonIconRoot, {\n className: classes.root,\n ownerState: ownerState,\n children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(RadioButtonIconBackground, {\n fontSize: fontSize,\n className: classes.background,\n ownerState: ownerState\n }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(RadioButtonIconDot, {\n fontSize: fontSize,\n className: classes.dot,\n ownerState: ownerState\n })]\n });\n}\n true ? RadioButtonIcon.propTypes = {\n /**\n * If `true`, the component is checked.\n */\n checked: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().bool),\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_6___default().object),\n /**\n * The size of the component.\n * `small` is equivalent to the dense radio styling.\n */\n fontSize: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOf(['small', 'medium'])\n} : 0;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RadioButtonIcon);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Radio/RadioButtonIcon.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/Radio/radioClasses.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/@mui/material/Radio/radioClasses.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 */ getRadioUtilityClass: () => (/* binding */ getRadioUtilityClass)\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 getRadioUtilityClass(slot) {\n return (0,_generateUtilityClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('MuiRadio', slot);\n}\nconst radioClasses = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('MuiRadio', ['root', 'checked', 'disabled', 'colorPrimary', 'colorSecondary']);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (radioClasses);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/Radio/radioClasses.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/Select/Select.js":
/*!*****************************************************!*\
!*** ./node_modules/@mui/material/Select/Select.js ***!
@@ -1735,6 +1878,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 ***!
@@ -1889,6 +2076,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 ***!
@@ -2054,6 +2274,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 ***!
@@ -2109,6 +2340,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/internal/svg-icons/Person.js":
/*!*****************************************************************!*\
!*** ./node_modules/@mui/material/internal/svg-icons/Person.js ***!
@@ -2120,6 +2373,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/material/internal/svg-icons/RadioButtonChecked.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/@mui/material/internal/svg-icons/RadioButtonChecked.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.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z\"\n}), 'RadioButtonChecked'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/RadioButtonChecked.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/material/internal/svg-icons/RadioButtonUnchecked.js":
+/*!*******************************************************************************!*\
+ !*** ./node_modules/@mui/material/internal/svg-icons/RadioButtonUnchecked.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: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"\n}), 'RadioButtonUnchecked'));\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/internal/svg-icons/RadioButtonUnchecked.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/internal/switchBaseClasses.js":
/*!******************************************************************!*\
!*** ./node_modules/@mui/material/internal/switchBaseClasses.js ***!
@@ -2153,6 +2428,17 @@ eval("\n\nif (false) {} else {\n module.exports = __webpack_require__(/*! ./cjs
/***/ }),
+/***/ "./node_modules/@mui/material/styles/ThemeProvider.js":
+/*!************************************************************!*\
+ !*** ./node_modules/@mui/material/styles/ThemeProvider.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 */ ThemeProvider)\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_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_system__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/system */ \"./node_modules/@mui/system/esm/ThemeProvider/ThemeProvider.js\");\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./identifier */ \"./node_modules/@mui/material/styles/identifier.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 = [\"theme\"];\n\n\n\n\n\nfunction ThemeProvider(_ref) {\n let {\n theme: themeInput\n } = _ref,\n props = (0,_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, _excluded);\n const scopedTheme = themeInput[_identifier__WEBPACK_IMPORTED_MODULE_4__[\"default\"]];\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_mui_system__WEBPACK_IMPORTED_MODULE_5__[\"default\"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, props, {\n themeId: scopedTheme ? _identifier__WEBPACK_IMPORTED_MODULE_4__[\"default\"] : undefined,\n theme: scopedTheme || themeInput\n }));\n}\n true ? ThemeProvider.propTypes = {\n /**\n * Your component tree.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().node),\n /**\n * A theme object. You can provide a function to extend the outer theme.\n */\n theme: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_6___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)]).isRequired\n} : 0;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/styles/ThemeProvider.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/styles/createMixins.js":
/*!***********************************************************!*\
!*** ./node_modules/@mui/material/styles/createMixins.js ***!
@@ -2318,6 +2604,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/material/utils/createChainedFunction.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@mui/material/utils/createChainedFunction.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 _mui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/createChainedFunction.js\");\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_mui_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/utils/createChainedFunction.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/utils/createSvgIcon.js":
/*!***********************************************************!*\
!*** ./node_modules/@mui/material/utils/createSvgIcon.js ***!
@@ -2461,6 +2758,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/material/utils/useId.js":
+/*!***************************************************!*\
+ !*** ./node_modules/@mui/material/utils/useId.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 _mui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/useId/useId.js\");\n'use client';\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_mui_utils__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/material/utils/useId.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/material/utils/useIsFocusVisible.js":
/*!***************************************************************!*\
!*** ./node_modules/@mui/material/utils/useIsFocusVisible.js ***!
@@ -2472,6 +2780,50 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/private-theming/ThemeProvider/ThemeProvider.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/@mui/private-theming/ThemeProvider/ThemeProvider.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_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\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_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/exactProp/exactProp.js\");\n/* harmony import */ var _useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../useTheme/ThemeContext */ \"./node_modules/@mui/private-theming/useTheme/ThemeContext.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../useTheme */ \"./node_modules/@mui/private-theming/useTheme/useTheme.js\");\n/* harmony import */ var _nested__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nested */ \"./node_modules/@mui/private-theming/ThemeProvider/nested.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n\n\n\n\n\n\n\n\n// To support composition of theme.\n\nfunction mergeOuterLocalTheme(outerTheme, localTheme) {\n if (typeof localTheme === 'function') {\n const mergedTheme = localTheme(outerTheme);\n if (true) {\n if (!mergedTheme) {\n console.error(['MUI: You should return an object from your theme function, i.e.', ' ({})} />'].join('\\n'));\n }\n }\n return mergedTheme;\n }\n return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerTheme, localTheme);\n}\n\n/**\n * This component takes a `theme` prop.\n * It makes the `theme` available down the React tree thanks to React context.\n * This component should preferably be used at **the root of your component tree**.\n */\nfunction ThemeProvider(props) {\n const {\n children,\n theme: localTheme\n } = props;\n const outerTheme = (0,_useTheme__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n if (true) {\n if (outerTheme === null && typeof localTheme === 'function') {\n console.error(['MUI: You are providing a theme function prop to the ThemeProvider component:', ' outerTheme} />', '', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n'));\n }\n }\n const theme = react__WEBPACK_IMPORTED_MODULE_1__.useMemo(() => {\n const output = outerTheme === null ? localTheme : mergeOuterLocalTheme(outerTheme, localTheme);\n if (output != null) {\n output[_nested__WEBPACK_IMPORTED_MODULE_4__[\"default\"]] = outerTheme !== null;\n }\n return output;\n }, [localTheme, outerTheme]);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_5__[\"default\"].Provider, {\n value: theme,\n children: children\n });\n}\n true ? ThemeProvider.propTypes = {\n /**\n * Your component tree.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().node),\n /**\n * A theme object. You can provide a function to extend the outer theme.\n */\n theme: prop_types__WEBPACK_IMPORTED_MODULE_6___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_6___default().object), (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)]).isRequired\n} : 0;\nif (true) {\n true ? ThemeProvider.propTypes = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(ThemeProvider.propTypes) : 0;\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ThemeProvider);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/private-theming/ThemeProvider/ThemeProvider.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/private-theming/ThemeProvider/nested.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/@mui/private-theming/ThemeProvider/nested.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 */ });\nconst hasSymbol = typeof Symbol === 'function' && Symbol.for;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (hasSymbol ? Symbol.for('mui.nested') : '__THEME_NESTED__');\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/private-theming/ThemeProvider/nested.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/private-theming/useTheme/ThemeContext.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@mui/private-theming/useTheme/ThemeContext.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\nconst ThemeContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext(null);\nif (true) {\n ThemeContext.displayName = 'ThemeContext';\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ThemeContext);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/private-theming/useTheme/ThemeContext.js?");
+
+/***/ }),
+
+/***/ "./node_modules/@mui/private-theming/useTheme/useTheme.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/@mui/private-theming/useTheme/useTheme.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 */ useTheme)\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 _ThemeContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ThemeContext */ \"./node_modules/@mui/private-theming/useTheme/ThemeContext.js\");\n\n\nfunction useTheme() {\n const theme = react__WEBPACK_IMPORTED_MODULE_0__.useContext(_ThemeContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n if (true) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue(theme);\n }\n return theme;\n}\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/private-theming/useTheme/useTheme.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/styled-engine/GlobalStyles/GlobalStyles.js":
/*!**********************************************************************!*\
!*** ./node_modules/@mui/styled-engine/GlobalStyles/GlobalStyles.js ***!
@@ -2538,6 +2890,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./node_modules/@mui/system/esm/ThemeProvider/ThemeProvider.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/@mui/system/esm/ThemeProvider/ThemeProvider.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_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\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_private_theming__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/private-theming */ \"./node_modules/@mui/private-theming/useTheme/useTheme.js\");\n/* harmony import */ var _mui_private_theming__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/private-theming */ \"./node_modules/@mui/private-theming/ThemeProvider/ThemeProvider.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/exactProp/exactProp.js\");\n/* harmony import */ var _mui_styled_engine__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/styled-engine */ \"./node_modules/@emotion/react/dist/emotion-element-c39617d8.browser.esm.js\");\n/* harmony import */ var _useThemeWithoutDefault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../useThemeWithoutDefault */ \"./node_modules/@mui/system/esm/useThemeWithoutDefault.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n\n\n\n\n\n\n\n\nconst EMPTY_THEME = {};\nfunction useThemeScoping(themeId, upperTheme, localTheme, isPrivate = false) {\n return react__WEBPACK_IMPORTED_MODULE_1__.useMemo(() => {\n const resolvedTheme = themeId ? upperTheme[themeId] || upperTheme : upperTheme;\n if (typeof localTheme === 'function') {\n const mergedTheme = localTheme(resolvedTheme);\n const result = themeId ? (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, upperTheme, {\n [themeId]: mergedTheme\n }) : mergedTheme;\n // must return a function for the private theme to NOT merge with the upper theme.\n // see the test case \"use provided theme from a callback\" in ThemeProvider.test.js\n if (isPrivate) {\n return () => result;\n }\n return result;\n }\n return themeId ? (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, upperTheme, {\n [themeId]: localTheme\n }) : (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, upperTheme, localTheme);\n }, [themeId, upperTheme, localTheme, isPrivate]);\n}\n\n/**\n * This component makes the `theme` available down the React tree.\n * It should preferably be used at **the root of your component tree**.\n *\n * // existing use case\n * // theme scoping\n */\nfunction ThemeProvider(props) {\n const {\n children,\n theme: localTheme,\n themeId\n } = props;\n const upperTheme = (0,_useThemeWithoutDefault__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(EMPTY_THEME);\n const upperPrivateTheme = (0,_mui_private_theming__WEBPACK_IMPORTED_MODULE_4__[\"default\"])() || EMPTY_THEME;\n if (true) {\n if (upperTheme === null && typeof localTheme === 'function' || themeId && upperTheme && !upperTheme[themeId] && typeof localTheme === 'function') {\n console.error(['MUI: You are providing a theme function prop to the ThemeProvider component:', ' outerTheme} />', '', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n'));\n }\n }\n const engineTheme = useThemeScoping(themeId, upperTheme, localTheme);\n const privateTheme = useThemeScoping(themeId, upperPrivateTheme, localTheme, true);\n return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_mui_private_theming__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n theme: privateTheme,\n children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_mui_styled_engine__WEBPACK_IMPORTED_MODULE_6__.T.Provider, {\n value: engineTheme,\n children: children\n })\n });\n}\n true ? ThemeProvider.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 * Your component tree.\n */\n children: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().node),\n /**\n * A theme object. You can provide a function to extend the outer theme.\n */\n theme: prop_types__WEBPACK_IMPORTED_MODULE_7___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_7___default().func), (prop_types__WEBPACK_IMPORTED_MODULE_7___default().object)]).isRequired,\n /**\n * The design system's unique id for getting the corresponded theme when there are multiple design systems.\n */\n themeId: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string)\n} : 0;\nif (true) {\n true ? ThemeProvider.propTypes = (0,_mui_utils__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(ThemeProvider.propTypes) : 0;\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ThemeProvider);\n\n//# sourceURL=webpack://parus_8_panels_plugin/./node_modules/@mui/system/esm/ThemeProvider/ThemeProvider.js?");
+
+/***/ }),
+
/***/ "./node_modules/@mui/system/esm/borders.js":
/*!*************************************************!*\
!*** ./node_modules/@mui/system/esm/borders.js ***!
@@ -3077,6 +3440,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 ***!
@@ -3304,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 */ 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 containerComponent,\n containerComponentProps,\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 containerComponent: containerComponent,\n containerComponentProps: containerComponentProps,\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 containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\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 fixedHeader = false,\n fixedColumns = 0,\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 morePagesBtnProps,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n containerComponent,\n containerComponentProps,\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 fixedHeader: fixedHeader,\n fixedColumns: fixedColumns,\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 containerComponent: containerComponent,\n containerComponentProps: containerComponentProps,\n morePagesBtnProps: morePagesBtnProps,\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 fixedHeader: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n fixedColumns: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\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 morePagesBtnProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\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 containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\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?");
/***/ }),
@@ -3326,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 */ 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 */ taskLegendDesc: () => (/* binding */ taskLegendDesc)\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_CONTENT: {\n minWidth: 400,\n overflowX: \"auto\"\n },\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 taskLegendDesc = ({\n task,\n taskColors\n}) => {\n if (Array.isArray(taskColors) && taskColors.length > 0) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) return {\n text: colorDesc.desc,\n style: {\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 };else return null;\n } else return null;\n};\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n taskDialogRenderer,\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 dispTaskAttributes = Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => attr.visible && hasValue(task[attr.name])) : [];\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 const legendDesc = taskLegendDesc({\n task,\n taskColors\n });\n let legend = legendDesc ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: legendDesc.style\n },\n primary: legendCaption,\n secondary: legendDesc.text\n }) : null;\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 }, taskDialogRenderer ? taskDialogRenderer({\n task,\n taskAttributes,\n taskColors,\n close: handleCancel\n }) : /*#__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_5__[\"default\"], {\n sx: STYLES.TASK_EDITOR_CONTENT\n }, /*#__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 })), hasValue(task.progress) || legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null, 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 })), legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : 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), dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : null, dispTaskAttributes.length > 0 ? dispTaskAttributes.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 < dispTaskAttributes.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 taskDialogRenderer: (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 taskDialogRenderer,\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 taskDialogRenderer: taskDialogRenderer,\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 taskDialogRenderer: (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 */ taskLegendDesc: () => (/* binding */ taskLegendDesc)\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 visible: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).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_CONTENT: {\n minWidth: 400,\n overflowX: \"auto\"\n },\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 taskLegendDesc = ({\n task,\n taskColors\n}) => {\n if (Array.isArray(taskColors) && taskColors.length > 0) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) return {\n text: colorDesc.desc,\n style: {\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 };else return null;\n } else return null;\n};\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n taskDialogRenderer,\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 dispTaskAttributes = Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => attr.visible && hasValue(task[attr.name])) : [];\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 const legendDesc = taskLegendDesc({\n task,\n taskColors\n });\n let legend = legendDesc ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: legendDesc.style\n },\n primary: legendCaption,\n secondary: legendDesc.text\n }) : null;\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 }, taskDialogRenderer ? taskDialogRenderer({\n task,\n taskAttributes,\n taskColors,\n close: handleCancel\n }) : /*#__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_5__[\"default\"], {\n sx: STYLES.TASK_EDITOR_CONTENT\n }, /*#__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 })), hasValue(task.progress) || legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null, 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 })), legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : 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), dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : null, dispTaskAttributes.length > 0 ? dispTaskAttributes.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 < dispTaskAttributes.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 taskDialogRenderer: (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 taskDialogRenderer,\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 taskDialogRenderer: taskDialogRenderer,\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 taskDialogRenderer: (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?");
/***/ }),
@@ -3341,6 +3715,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./app/components/p8p_svg.js":
+/*!***********************************!*\
+ !*** ./app/components/p8p_svg.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 */ P8PSVG: () => (/* binding */ P8PSVG)\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/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\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 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/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Интерактивные изображения SVG\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Контроль свойств компонента\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n GRID_ITEM_CANVAS: {\n width: \"100%\",\n height: \"100%\"\n },\n CONTROLS: {\n justifyContent: \"center\",\n alignItems: \"center\",\n display: \"flex\"\n }\n};\n\n//Структура элемента изображения\nconst P8P_SVG_ITEM_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n id: prop_types__WEBPACK_IMPORTED_MODULE_1___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_1___default().number)]).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().any),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_1___default().string))])\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Интерактивные изображения SVG\nconst P8PSVG = ({\n data,\n items,\n onClick,\n onItemClick,\n canvasStyle,\n fillOpacity\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n images: [],\n currentImage: 0,\n imagesCount: 0\n });\n\n //Ссылки на DOM\n const svgContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const svgRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент изображения\n const handleClick = e => {\n let itemClickFired = false;\n if (items && onItemClick) {\n const item = items.find(item => item.id == e.target?.id || item.id == e.target?.parentElement?.id);\n if (item) {\n onItemClick({\n item\n });\n itemClickFired = true;\n }\n }\n if (!itemClickFired && onClick) onClick(e);\n };\n\n //Формирование интерактивных элементов изображения\n const makeSVGItems = () => {\n items.forEach(item => {\n const svgE = document.getElementById(item.id);\n if (svgE) {\n //Запомним старый стиль элемента\n let styleOld = svgE.getAttribute(\"style\") || \"\";\n if (styleOld && !styleOld.endsWith(\";\")) styleOld = `${styleOld};`;\n //Сформируем стиль для заливки\n let fillStyle = \"\";\n if (item.backgroundColor) fillStyle = `fill: ${item.backgroundColor}; ${fillOpacity ? `opacity: ${fillOpacity};` : \"\"}`;\n //Сформируем стиль для курсора\n let cursorStyle = \"\";\n if (onItemClick) cursorStyle = \"cursor: pointer;\";\n //Добавим элемент для всплывающей подсказки\n let titleE = null;\n if (item?.title) {\n titleE = document.createElementNS(\"http://www.w3.org/2000/svg\", \"title\");\n titleE.textContent = item.title;\n svgE.appendChild(titleE);\n }\n //Если нем попалась группа\n if (svgE.tagName == \"g\") {\n //Установим ей новые стили\n svgE.setAttribute(\"style\", `${styleOld}${cursorStyle}`);\n //И заливку всем дочерним элементам\n if (fillStyle) for (const child of svgE.children) {\n let childStyleOld = child.getAttribute(\"style\") || \"\";\n if (childStyleOld && !childStyleOld.endsWith(\";\")) childStyleOld = `${childStyleOld};`;\n child.setAttribute(\"style\", `${childStyleOld}${fillStyle}`);\n }\n } else {\n //Это простой элемент, не группа - просто выставляем стили\n svgE.setAttribute(\"style\", `${styleOld}${cursorStyle}${fillStyle}`);\n }\n }\n });\n };\n\n //Загрузка изображения\n const loadSVG = () => {\n const images = data.split(\"\").filter(i => i).map(i => i + \"\");\n setState(pv => ({\n ...pv,\n images,\n imagesCount: images.length,\n currentImage: 0\n }));\n };\n\n //Отображение текущего изображения\n const showSVG = () => {\n if (state.imagesCount > 0) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(state.images[state.currentImage], \"image/svg+xml\");\n svgRef.current = doc.documentElement;\n svgRef.current.onclick = handleClick;\n svgContainerRef.current.replaceChildren(svgRef.current);\n if (items) makeSVGItems(items);\n }\n };\n\n //Переключение текущего изображения\n const switchImage = direction => {\n setState(pv => ({\n ...pv,\n currentImage: direction > 0 ? pv.currentImage + 1 >= pv.imagesCount ? 0 : pv.currentImage + 1 : pv.currentImage - 1 < 0 ? pv.imagesCount - 1 : pv.currentImage - 1\n }));\n };\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadSVG();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n //При загрузке изображения\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n showSVG();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.images, state.currentImage, items]);\n\n //При прокрутке изображений назад\n const handlePrevClick = () => switchImage(1);\n\n //При прокрутке изображений вперёд\n const handleNextClick = () => switchImage(-1);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n container: true,\n direction: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n spacing: 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n item: true,\n xs: 12,\n sx: STYLES.GRID_ITEM_CANVAS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: svgContainerRef,\n style: {\n ...(canvasStyle ? canvasStyle : {})\n }\n })), state.imagesCount > 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTROLS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: handlePrevClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"arrow_left\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: handleNextClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"arrow_right\")))) : null));\n};\n\n//Контроль свойств - Интерактивные изображения SVG\nP8PSVG.propTypes = {\n data: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n items: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_SVG_ITEM_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n canvasStyle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object),\n fillOpacity: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_svg.js?");
+
+/***/ }),
+
/***/ "./app/components/p8p_table.js":
/*!*************************************!*\
!*** ./app/components/p8p_table.js ***!
@@ -3348,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 */ 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 containerComponent,\n containerComponentProps\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\"], _extends({\n component: containerComponent ? containerComponent : _mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"]\n }, containerComponentProps ? containerComponentProps : {}), /*#__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 containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object)\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_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_styles__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/useTheme.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 //Взаимодействие со стилями MUI\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_HEAD_STICKY: {\n position: \"sticky\",\n top: 0,\n zIndex: 1000\n },\n TABLE_HEAD_CELL_STICKY: (theme, left) => ({\n position: \"sticky\",\n left,\n backgroundColor: theme.palette.background.default,\n zIndex: 1000\n }),\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_STICKY: (theme, left) => ({\n position: \"sticky\",\n left,\n backgroundColor: theme.palette.background.default,\n zIndex: 500\n }),\n TABLE_CELL_EXPAND_CONTROL: {\n minWidth: \"60px\",\n maxWidth: \"60px\"\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_CELL_GROUP_HEADER_STICKY: {\n position: \"sticky\",\n left: 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 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 fixedHeader = false,\n fixedColumns = 0,\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 morePagesBtnProps,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier,\n containerComponent,\n containerComponentProps\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 theme = (0,_mui_material_styles__WEBPACK_IMPORTED_MODULE_17__[\"default\"])();\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 fixedColumns,\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 fixedColumns,\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 fixedColumns,\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 fixedColumns,\n objectsCopier\n });\n }, [columnsDef, expandable, fixedColumns, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return header.displayDataColumns.map((columnDef, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `group-header-cell-${i}`\n }, customRender.cellProps, {\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle,\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(i == 0 && fixedColumns ? STYLES.TABLE_CELL_GROUP_HEADER_STICKY : {})\n },\n colSpan: expandable && rowExpandRender ? 2 : 1\n }), i == 0 ? /*#__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) : null));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", 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_19__[\"default\"], _extends({\n component: containerComponent ? containerComponent : _mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"]\n }, containerComponentProps ? containerComponentProps : {}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n stickyHeader: fixedHeader,\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_22__[\"default\"], {\n sx: fixedHeader ? STYLES.TABLE_HEAD_STICKY : {}\n }, header.displayLevels.map((level, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: level\n }, expandable && rowExpandRender && i == 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\",\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTROL,\n ...(fixedColumns ? STYLES.TABLE_HEAD_CELL_STICKY(theme, 0) : {})\n },\n rowSpan: header.displayLevelsColumns[level][0].rowSpan\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_18__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(columnDef.fixed ? STYLES.TABLE_HEAD_CELL_STICKY(theme, columnDef.fixedLeft) : {}),\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_24__[\"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_25__[\"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_23__[\"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_18__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\",\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTROL,\n ...(fixedColumns ? STYLES.TABLE_CELL_STICKY(theme, 0) : {})\n }\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_18__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(columnDef.fixed ? STYLES.TABLE_CELL_STICKY(theme, columnDef.fixedLeft) : {}),\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_23__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTAINER,\n ...(fixedColumns ? STYLES.TABLE_CELL_STICKY(theme, 0) : {})\n },\n colSpan: fixedColumns ? header.displayFixedColumnsCount + 1 : 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_23__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n colSpan: header.displayDataColumnsCount\n }, /*#__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_26__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _extends({\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnProps ? morePagesBtnProps : {}), 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 width: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number)\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 fixedHeader: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n fixedColumns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\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 morePagesBtnProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object),\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 containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?");
/***/ }),
@@ -3359,7 +3744,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 */ 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 */ 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 displayFixedColumnsCount: 0\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 if (!hasValue(tmp.fixed)) tmp.fixed = false;\n if (!hasValue(tmp.fixedLeft)) tmp.fixedLeft = 0;\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 getFixedColumns = (displayTree, parentFixed, parentLeft, fixedColumns) => {\n if (fixedColumns) {\n let left = parentLeft;\n displayTree.forEach((columnDef, i) => {\n left += columnDef.width;\n if (columnDef.level == 1 && i + 1 <= fixedColumns || columnDef.level > 1 && parentFixed) {\n columnDef.fixed = true;\n columnDef.fixedLeft = left - columnDef.width;\n } else columnDef.fixed = false;\n if (columnDef.hasChild) getFixedColumns(columnDef.child, columnDef.fixed, columnDef.fixedLeft, fixedColumns);\n });\n }\n};\n\n//Формирование дерева отображаемых элементов заголовка\nconst buildDisplayTree = (columnsDef, parent, level, expandable, fixedColumns) => {\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 getFixedColumns(displayTree, false, expandable ? 60 : 0, fixedColumns);\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 getDisplayFixedColumnsCount = displayTree => {\n let res = 0;\n const traverseTree = displayTree => {\n displayTree.forEach(columnDef => columnDef.hasChild ? traverseTree(columnDef.child) : columnDef.fixed ? res++ : null);\n };\n traverseTree(displayTree);\n return res;\n};\n\n//Формирование описания отображаемых колонок\nconst buildDisplay = ({\n columnsDef,\n expandable,\n fixedColumns\n}) => {\n //Сформируем дерево отображаемых колонок заголовка\n const [displayTree, maxLevel] = buildDisplayTree(columnsDef, \"\", 1, expandable, fixedColumns);\n //Вытянем дерево в удобные для рендеринга структуры\n const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);\n //Сформируем отображаемые колонки данных\n const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);\n //Подсчитаем количество отображаемых фиксированных колонок\n const displayFixedColumnsCount = getDisplayFixedColumnsCount(displayTree);\n //Вернём результат\n return [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount, displayFixedColumnsCount];\n};\n\n//Формирование описания заголовка\nconst buildHeaderDef = ({\n columnsDef,\n expandable,\n fixedColumns,\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, res.displayFixedColumnsCount] = buildDisplay({\n columnsDef: res.columnsDef,\n expandable,\n fixedColumns\n });\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 fixedColumns,\n objectsCopier\n } = payload;\n return {\n ...state,\n ...buildHeaderDef({\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n })\n };\n },\n [P8P_TABLE_AT.TOGGLE_HEADER_EXPAND]: (state, {\n payload\n }) => {\n const {\n columnName,\n expandable,\n fixedColumns,\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, displayFixedColumnsCount] = buildDisplay({\n columnsDef,\n expandable,\n fixedColumns\n });\n return {\n ...state,\n columnsDef,\n displayLevels,\n displayLevelsColumns,\n displayDataColumns,\n displayDataColumnsCount,\n displayFixedColumnsCount\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?");
/***/ }),
@@ -3502,7 +3887,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 */ 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/* 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/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.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/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormHelperText/FormHelperText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.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 _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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 EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n });\n\n // Состояние информации о трудоёмкости\n const [info, setInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n cntP: 0,\n sumP: 0,\n cntF: 0,\n sumF: 0\n });\n\n // Состояние фильтра (для отладки)\n // const [filter, setFilter] = useState({\n // belong: \"Демопример\",\n // prodObj: \"Карьер\",\n // techServ: \"\",\n // respDep: \"\",\n // fromMonth: 1,\n // fromYear: 2024,\n // toMonth: 12,\n // toYear: 2024\n // });\n\n // Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n });\n // Состояние открытия фильтра\n const [filterOpen, setFilterOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n // Состояние данных по умолчанию для фильтра (true - для отладки)\n const [defaultLoaded, setDefaultLoaded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n // Состояние хранения копии фильтра\n const [filterCopy, setFilterCopy] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ...filter\n });\n // Состояние ограничения редактирования фильтра\n const [filterLock, setFilterLock] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n // Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n // Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary,\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingС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_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ,\n SRESPDEP: filter.respDep,\n NFROMMONTH: filter.fromMonth,\n NFROMYEAR: filter.fromYear,\n NTOMONTH: filter.toMonth,\n NTOYEAR: filter.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setInfo({\n cntP: cP,\n sumP: sP,\n cntF: cF,\n sumF: sF\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, filter, executeStored]);\n\n //Загрузка значений фильра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n belong: data.JURPERS,\n fromMonth: data.MONTH,\n fromYear: data.YEAR,\n toMonth: data.MONTH,\n toYear: data.YEAR\n }));\n setDefaultLoaded(true);\n }, [executeStored]);\n\n //пользовательский параметр JuridicalPerson системы\n // const getJurPers = useCallback(async () => {\n // const data = await executeStored({\n // stored: \"PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM\",\n // respArg: \"CRES\"\n // });\n // setFilter(pv => ({ ...pv, belong: data }));\n // }, [executeStored]);\n\n // Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n\n //if (day == undefined) day = null;\n\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ ? filter.techServ : null,\n SRESPDEP: filter.respDep ? filter.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n // Открыть фильтр\n const openFilter = () => {\n setFilterOpen(true);\n };\n\n // Закрыть фильтр\n const closeFilter = e => {\n if (filterLock && e != undefined) setFilter(filterCopy);\n setFilterOpen(false);\n };\n\n // Очистить фильтр\n const clearFilter = () => {\n setFilter({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: \"\",\n fromYear: \"\",\n toMonth: \"\",\n toYear: \"\"\n });\n };\n\n // Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n // При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n // При открытом фильтре\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filterOpen) {\n {\n setFilterCopy({\n ...filter\n });\n if (!defaultLoaded) loadDefaultFilter();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterOpen]);\n\n // При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n //console.log(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2);\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n let yearArray = [];\n const monthArray = [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Май\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Октябрь\", \"Ноябрь\", \"Декабрь\"];\n let today = new Date();\n\n // Получение списка лет\n const getYearArray = () => {\n for (let i = 1990; i <= today.getFullYear(); i++) {\n yearArray.push(i);\n }\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, getYearArray(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: filterOpen,\n onClose: closeFilter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeFilter,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"close\")), /*#__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\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true,\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"belong-outlined\"\n }, \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.belong ? false : true,\n id: \"belong-outlined\",\n value: filter.belong,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"belong select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"JuridicalPersons\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n belong: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"belong-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"\n }), filter.belong ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"belong-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"prodObj-outlined\"\n }, \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.prodObj ? false : true,\n id: \"prodObj-outlined\",\n value: filter.prodObj,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"prodObj select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"EquipConfiguration\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n prodObj: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"prodObj-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"\n }), filter.prodObj ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"prodObj-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"techServ-outlined\"\n }, \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"techServ-outlined\",\n value: filter.techServ,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"techServ select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n techServ: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"respDep-outlined\"\n }, \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"respDep-outlined\",\n value: filter.respDep,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"respDep select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n respDep: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromMonth ? false : true,\n labelId: \"from-month-select-label\",\n id: \"from-month-select\",\n value: filter.fromMonth,\n \"aria-describedby\": \"from-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.fromMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromYear ? false : true,\n labelId: \"from-year-select-label\",\n id: \"from-year-select\",\n value: filter.fromYear,\n \"aria-describedby\": \"from-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.fromYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043D\\u0435\\u0446 \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toMonth ? false : true,\n labelId: \"to-month-select-label\",\n id: \"to-month-select\",\n value: filter.toMonth,\n \"aria-describedby\": \"to-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.toMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toYear ? false : true,\n labelId: \"to-year-select-label\",\n id: \"to-year-select\",\n value: filter.toYear,\n \"aria-describedby\": \"to-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.toYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n disabled: filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true,\n onClick: () => {\n setFilterLock(true);\n setDataGrid({\n reload: true\n });\n closeFilter();\n }\n }, \"\\u0421\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: clearFilter\n }, \"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: () => {\n setFilter(filterCopy);\n }\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n textAlign: \"left\",\n onClick: openFilter\n }, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430: \", 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 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 1\n }, /*#__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 headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n })))))) : null);\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 */ 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/* 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/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.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/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormHelperText/FormHelperText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.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 _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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 EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n });\n\n // Состояние информации о трудоёмкости\n const [info, setInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n cntP: 0,\n sumP: 0,\n cntF: 0,\n sumF: 0\n });\n\n // Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n });\n // Состояние открытия фильтра\n const [filterOpen, setFilterOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n // Состояние данных по умолчанию для фильтра\n const [defaultLoaded, setDefaultLoaded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n // Состояние хранения копии фильтра\n const [filterCopy, setFilterCopy] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ...filter\n });\n // Состояние ограничения редактирования фильтра\n const [filterLock, setFilterLock] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n // Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n // Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary,\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingС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_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ,\n SRESPDEP: filter.respDep,\n NFROMMONTH: filter.fromMonth,\n NFROMYEAR: filter.fromYear,\n NTOMONTH: filter.toMonth,\n NTOYEAR: filter.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setInfo({\n cntP: cP,\n sumP: sP,\n cntF: cF,\n sumF: sF\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, filter, executeStored]);\n\n //Загрузка значений фильра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n belong: data.JURPERS,\n fromMonth: 1,\n fromYear: data.YEAR,\n toMonth: 12,\n toYear: data.YEAR\n }));\n setDefaultLoaded(true);\n }, [executeStored]);\n\n // Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n\n //if (day == undefined) day = null;\n\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.belong,\n SPRODOBJ: filter.prodObj,\n STECHSERV: filter.techServ ? filter.techServ : null,\n SRESPDEP: filter.respDep ? filter.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n // Открыть фильтр\n const openFilter = () => {\n setFilterOpen(true);\n };\n\n // Закрыть фильтр\n const closeFilter = e => {\n if (filterLock && e != undefined) setFilter(filterCopy);\n setFilterOpen(false);\n };\n\n // Очистить фильтр\n const clearFilter = () => {\n setFilter({\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: \"\",\n fromYear: \"\",\n toMonth: \"\",\n toYear: \"\"\n });\n };\n\n // Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n // При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n // При открытом фильтре\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filterOpen) {\n {\n setFilterCopy({\n ...filter\n });\n if (!defaultLoaded) loadDefaultFilter();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterOpen]);\n\n // При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n let yearArray = [];\n const monthArray = [\"Январь\", \"Февраль\", \"Март\", \"Апрель\", \"Май\", \"Июнь\", \"Июль\", \"Август\", \"Сентябрь\", \"Октябрь\", \"Ноябрь\", \"Декабрь\"];\n let today = new Date();\n\n // Получение списка лет\n const getYearArray = () => {\n for (let i = 1990; i <= today.getFullYear(); i++) {\n yearArray.push(i);\n }\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, getYearArray(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: filterOpen,\n onClose: closeFilter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeFilter,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"close\")), /*#__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\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true,\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"belong-outlined\"\n }, \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.belong ? false : true,\n id: \"belong-outlined\",\n value: filter.belong,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"belong select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"JuridicalPersons\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n belong: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"belong-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u0438\\u043D\\u0430\\u0434\\u043B\\u0435\\u0436\\u043D\\u043E\\u0441\\u0442\\u044C\"\n }), filter.belong ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"belong-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"prodObj-outlined\"\n }, \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n error: filter.prodObj ? false : true,\n id: \"prodObj-outlined\",\n value: filter.prodObj,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"prodObj select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"EquipConfiguration\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n prodObj: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n \"aria-describedby\": \"prodObj-outlined-helper-text\",\n label: \"\\u041F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043E\\u0431\\u044A\\u0435\\u043A\\u0442\"\n }), filter.prodObj ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"prodObj-outlined-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"techServ-outlined\"\n }, \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"techServ-outlined\",\n value: filter.techServ,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"techServ select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n techServ: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u0441\\u043B\\u0443\\u0436\\u0431\\u0430\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n readOnly: true,\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n htmlFor: \"respDep-outlined\"\n }, \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n id: \"respDep-outlined\",\n value: filter.respDep,\n endAdornment: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n \"aria-label\": \"respDep select\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"INS_DEPARTMENT\",\n callBack: res => res.success === true ? setFilter(pv => ({\n ...pv,\n respDep: res.outParameters.out_CODE\n })) : null\n });\n },\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"list\"))),\n label: \"\\u041E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E\\u0434\\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromMonth ? false : true,\n labelId: \"from-month-select-label\",\n id: \"from-month-select\",\n value: filter.fromMonth,\n \"aria-describedby\": \"from-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.fromMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"from-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.fromYear ? false : true,\n labelId: \"from-year-select-label\",\n id: \"from-year-select\",\n value: filter.fromYear,\n \"aria-describedby\": \"from-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n fromYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.fromYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"from-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"section\",\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n textAlign: \"center\",\n item: true,\n xs: 4\n }, \"\\u041A\\u043E\\u043D\\u0435\\u0446 \\u043F\\u0435\\u0440\\u0438\\u043E\\u0434\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-month-select-label\"\n }, \"\\u041C\\u0435\\u0441\\u044F\\u0446\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toMonth ? false : true,\n labelId: \"to-month-select-label\",\n id: \"to-month-select\",\n value: filter.toMonth,\n \"aria-describedby\": \"to-month-select-helper-text\",\n label: \"\\u041C\\u0435\\u0441\\u044F\\u0446\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toMonth: e.target.value\n }))\n }, monthArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i + 1,\n value: i + 1\n }, item))), filter.toMonth ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-month-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n id: \"to-year-select-label\"\n }, \"\\u0413\\u043E\\u0434\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n error: filter.toYear ? false : true,\n labelId: \"to-year-select-label\",\n id: \"to-year-select\",\n value: filter.toYear,\n \"aria-describedby\": \"to-year-select-helper-text\",\n label: \"\\u0413\\u043E\\u0434\",\n onChange: e => setFilter(pv => ({\n ...pv,\n toYear: e.target.value\n }))\n }, yearArray.map((item, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n key: i,\n value: item\n }, item))), filter.toYear ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"to-year-select-helper-text\",\n sx: {\n color: \"red\"\n }\n }, \"*\\u041E\\u0431\\u044F\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u043E\\u043B\\u0435\"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n disabled: filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true,\n onClick: () => {\n setFilterLock(true);\n setDataGrid({\n reload: true\n });\n closeFilter();\n }\n }, \"\\u0421\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: clearFilter\n }, \"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n variant: \"contained\",\n onClick: () => {\n setFilter(filterCopy);\n }\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n textAlign: \"left\",\n onClick: openFilter\n }, \"\\u0424\\u0438\\u043B\\u044C\\u0442\\u0440 \\u043E\\u0442\\u0431\\u043E\\u0440\\u0430: \", 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 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"outlined\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 1\n }, /*#__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 headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n })))))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?");
/***/ }),
@@ -3524,7 +3909,150 @@ 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 */ DAY_NAME_REG_EXP: () => (/* binding */ DAY_NAME_REG_EXP),\n/* harmony export */ DIGITS_REG_EXP: () => (/* binding */ DIGITS_REG_EXP),\n/* harmony export */ MONTH_NAME_REG_EXP: () => (/* binding */ MONTH_NAME_REG_EXP),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\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/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n\n//---------\n//Константы\n//---------\n\n//Шаблон чисел и имён ячеек дат\nconst DIGITS_REG_EXP = /\\d+,?\\d*/g;\nconst MONTH_NAME_REG_EXP = /_\\d{4}_\\d{1,2}/;\nconst DAY_NAME_REG_EXP = /_\\d{4}_\\d{1,2}_\\d{1,2}/;\nlet curParent = \"\";\nlet x = 0;\n\n//-----------\n//Тело модуля\n//-----------\n\nconst formatDate = date => {\n const [year, month, day] = date.substring(1).split(\"_\");\n let nd;\n if (day == null) nd = `${month < 10 ? \"0\" + month : month}.${year}`;else nd = `${day < 10 ? \"0\" + day : day}.${month < 10 ? \"0\" + month : month}.${year}`;\n return nd;\n};\n\n// eslint-disable-next-line no-unused-vars\nconst headCellRender = ({\n columnDef\n}, hClick, podr, cntP, sumP, cntF, sumF) => {\n let cellStyle = {\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let stackStyle = {};\n let data = columnDef.caption;\n if (columnDef.expandable) {\n const ref = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createRef)();\n cellStyle = {\n ...cellStyle,\n padding: \"5px\"\n };\n cellProps = {\n ...cellProps,\n ref: ref,\n onClick: e => {\n hClick(e, ref);\n }\n };\n stackStyle = {\n flexDirection: \"column\"\n };\n }\n if (columnDef.name == \"STEST\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.name == \"SINFO\" || columnDef.name == \"SINFO2\") {\n cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO\") cellProps = {\n ...cellProps,\n rowSpan: 2\n };\n //if (columnDef.name == \"SINFO\") {\n //cellStyle = { display: \"none\" };\n // cellStyle = { ...cellStyle, padding: \"unset\" };\n // data = (\n // \n // \n // \n // Подразделение:\n // \n // \n // {podr}\n // \n // \n // Кол-во ремонтов, план:\n // \n // \n // {cntP}\n // \n // \n // Трудоемкость, час. план:\n // \n // \n // {sumP}\n // \n // \n // Кол-во ремонтов, факт:\n // \n // \n // {cntF}\n // \n // \n // Трудоемкость, час. факт:\n // \n // \n // {sumF}\n // \n // \n // \n // );\n //}\n }\n\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {\n cellStyle = {\n ...cellStyle,\n padding: \"5px\",\n minWidth: \"25px\",\n maxWidth: \"25px\"\n };\n stackStyle = {\n justifyContent: \"center\"\n };\n }\n return {\n cellStyle,\n cellProps,\n stackStyle,\n data\n };\n};\nconst dataCellRender = ({\n row,\n columnDef\n}, showEquipSrv) => {\n let cellStyle = {\n padding: \"2px\",\n border: \"1px solid rgba(0, 0, 0) !important\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = \" \";\n if (row[\"SINFO2\"] == undefined) {\n if (columnDef.name == \"STEST\") {\n cellProps = {\n colSpan: 2\n };\n cellStyle = {\n ...cellStyle,\n textAlign: \"right\",\n fontWeight: \"bold\"\n };\n }\n if (columnDef.name == \"SINFO2\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.parent == \"\" && columnDef.expandable == true && columnDef.expanded == false) {\n curParent = columnDef.name;\n return {\n cellStyle: {\n ...cellStyle,\n height: \"25px\"\n },\n data\n };\n } else if (columnDef.name != \"SINFO2\" && columnDef.parent != \"\" && columnDef.expandable == false && columnDef.expanded == true) {\n if (columnDef.name.endsWith(\"_1\")) {\n curParent = columnDef.parent;\n const [year, month] = curParent.substring(1).split(\"_\");\n x = new Date(year, month, 0).getDate();\n cellProps = {\n colSpan: x\n };\n data = row[curParent];\n return {\n cellStyle,\n cellProps,\n data\n };\n } else {\n cellStyle = {\n display: \"none\"\n };\n }\n }\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"План\") {\n cellStyle = {\n ...cellStyle\n };\n cellProps = {\n rowSpan: 2\n };\n }\n if (columnDef.name == \"STEST\" && row[\"SINFO2\"] == \"Факт\") {\n cellStyle = {\n display: \"none\"\n };\n }\n switch (row[columnDef.name]) {\n case \"blue\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"lightblue\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"green\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"red\":\n cellStyle = {\n ...cellStyle,\n backgroundColor: \"crimson\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green red\":\n case \"red green\":\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n maxHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"green\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"g\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n backgroundColor: \"crimson\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SINFO2\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"r\"))));\n }\n return {\n cellStyle,\n cellProps\n };\n};\nconst groupCellRender = () => {\n let cellStyle = {\n display: \"none\"\n };\n return {\n cellStyle\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/layouts.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DAY_NAME_REG_EXP: () => (/* binding */ DAY_NAME_REG_EXP),\n/* harmony export */ DIGITS_REG_EXP: () => (/* binding */ DIGITS_REG_EXP),\n/* harmony export */ MONTH_NAME_REG_EXP: () => (/* binding */ MONTH_NAME_REG_EXP),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\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/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n\n\n//---------\n//Константы\n//---------\n\n//Шаблон чисел и имён ячеек дат\nconst DIGITS_REG_EXP = /\\d+,?\\d*/g;\nconst MONTH_NAME_REG_EXP = /_\\d{4}_\\d{1,2}/;\nconst DAY_NAME_REG_EXP = /_\\d{4}_\\d{1,2}_\\d{1,2}/;\nlet curParent = \"\";\nlet x = 0;\n\n//-----------\n//Тело модуля\n//-----------\n\nconst formatDate = date => {\n const [year, month, day] = date.substring(1).split(\"_\");\n let nd;\n if (day == null) nd = `${month < 10 ? \"0\" + month : month}.${year}`;else nd = `${day < 10 ? \"0\" + day : day}.${month < 10 ? \"0\" + month : month}.${year}`;\n return nd;\n};\n\n// eslint-disable-next-line no-unused-vars\nconst headCellRender = ({\n columnDef\n}, hClick, podr, cntP, sumP, cntF, sumF) => {\n let cellStyle = {\n border: \"1px solid rgba(0, 0, 0)\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let stackStyle = {};\n let data = columnDef.caption;\n if (columnDef.expandable) {\n const ref = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createRef)();\n cellStyle = {\n ...cellStyle,\n padding: \"5px\"\n };\n cellProps = {\n ...cellProps,\n ref: ref,\n onClick: e => {\n hClick(e, ref);\n }\n };\n stackStyle = {\n flexDirection: \"column\"\n };\n }\n if (columnDef.name == \"SOBJINFO\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.name == \"SINFO\" || columnDef.name == \"SWRKTYPE\") {\n cellProps = {\n colSpan: 2\n };\n if (columnDef.name == \"SINFO\") cellProps = {\n ...cellProps,\n rowSpan: 2\n };\n }\n if (columnDef.name == \"SWRKTYPE\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {\n cellStyle = {\n ...cellStyle,\n padding: \"5px\",\n minWidth: \"25px\",\n maxWidth: \"25px\"\n };\n stackStyle = {\n justifyContent: \"center\"\n };\n }\n return {\n cellStyle,\n cellProps,\n stackStyle,\n data\n };\n};\nconst dataCellRender = ({\n row,\n columnDef\n}, showEquipSrv) => {\n let cellStyle = {\n padding: \"2px\",\n border: \"1px solid rgba(0, 0, 0) !important\",\n textAlign: \"center\"\n };\n let cellProps = {};\n let data = \" \";\n if (row[\"SWRKTYPE\"] == undefined) {\n if (columnDef.name == \"SOBJINFO\") {\n cellProps = {\n colSpan: 2\n };\n cellStyle = {\n ...cellStyle,\n textAlign: \"right\",\n fontWeight: \"bold\"\n };\n }\n if (columnDef.name == \"SWRKTYPE\") cellStyle = {\n display: \"none\"\n };\n if (columnDef.parent == \"\" && columnDef.expandable == true && columnDef.expanded == false) {\n curParent = columnDef.name;\n return {\n cellStyle: {\n ...cellStyle,\n height: \"25px\"\n },\n data\n };\n } else if (columnDef.name != \"SWRKTYPE\" && columnDef.parent != \"\" && columnDef.expandable == false && columnDef.expanded == true) {\n if (columnDef.name.endsWith(\"_1\")) {\n curParent = columnDef.parent;\n const [year, month] = curParent.substring(1).split(\"_\");\n x = new Date(year, month, 0).getDate();\n cellProps = {\n colSpan: x\n };\n data = row[curParent];\n return {\n cellStyle,\n cellProps,\n data\n };\n } else {\n cellStyle = {\n display: \"none\"\n };\n }\n }\n }\n if (columnDef.name == \"SOBJINFO\" && row[\"SWRKTYPE\"] == \"План\") {\n cellStyle = {\n ...cellStyle\n };\n cellProps = {\n rowSpan: 2\n };\n }\n if (columnDef.name == \"SOBJINFO\" && row[\"SWRKTYPE\"] == \"Факт\") {\n cellStyle = {\n display: \"none\"\n };\n }\n switch (row[columnDef.name]) {\n case \"blue\":\n cellStyle = {\n ...cellStyle,\n cursor: \"pointer\",\n backgroundColor: \"lightblue\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SWRKTYPE\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green\":\n cellStyle = {\n ...cellStyle,\n cursor: \"pointer\",\n backgroundColor: \"green\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SWRKTYPE\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"red\":\n cellStyle = {\n ...cellStyle,\n cursor: \"pointer\",\n backgroundColor: \"crimson\",\n border: \"1px solid rgba(0, 0, 0) !important\"\n };\n cellProps = {\n title: formatDate(columnDef.name),\n onClick: () => {\n showEquipSrv({\n date: columnDef.name,\n workType: row[\"SWRKTYPE\"],\n info: row[\"groupName\"]\n });\n }\n };\n return {\n cellStyle,\n cellProps,\n data\n };\n case \"green red\":\n case \"red green\":\n cellStyle = {\n ...cellStyle,\n padding: \"unset\"\n };\n cellProps = {\n title: formatDate(columnDef.name)\n };\n data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: {\n justifyContent: \"center\"\n },\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n maxHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n cursor: \"pointer\",\n backgroundColor: \"green\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SWRKTYPE\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"g\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 6,\n sx: {\n cursor: \"pointer\",\n backgroundColor: \"crimson\"\n },\n onClick: () => showEquipSrv({\n date: columnDef.name,\n workType: row[\"SWRKTYPE\"],\n info: row[\"groupName\"]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n display: \"none\"\n }\n }, \"r\"))));\n }\n return {\n cellStyle,\n cellProps\n };\n};\nconst groupCellRender = () => {\n let cellStyle = {\n display: \"none\"\n };\n return {\n cellStyle\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/layouts.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/components/plan_detail.js":
+/*!********************************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/components/plan_detail.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 */ PlanDetail: () => (/* binding */ PlanDetail)\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/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CircularProgress/CircularProgress.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.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 _components_p8p_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../components/p8p_svg */ \"./app/components/p8p_svg.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../hooks */ \"./app/panels/mech_rec_assembly_mon/hooks.js\");\n/* harmony import */ var _progress_box__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./progress_box */ \"./app/panels/mech_rec_assembly_mon/components/progress_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 //Интерфейсные элементы\n //Таблица данных\n //Интерактивные изображения\n //Подключение компонентов к настройкам приложения\n //Вспомогательные хуки\n //Информация по прогрессу объекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n BOX_INFO_MAIN: {\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"35vh\"\n },\n BOX_INFO_SUB: isMessage => ({\n overflow: \"hidden\",\n textAlign: \"center\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: isMessage ? \"center\" : \"flex-start\",\n paddingLeft: \"5px\",\n paddingRight: \"5px\",\n ...(isMessage ? {\n padding: \"5px\"\n } : {\n paddingTop: \"10px\"\n })\n }),\n DETAIL_INFO: {\n display: \"flex\",\n justifyContent: \"space-around\",\n alignItems: \"center\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"17vh\"\n },\n PRODUCT_SELECTOR_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"53vh\",\n marginTop: \"16px\"\n },\n PRODUCT_SELECTOR_MODEL: {\n width: \"70%\"\n },\n PLAN_INFO_MAIN: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\"\n },\n PLAN_INFO_SUB: {\n display: \"flex\",\n justifyContent: \"space-between\",\n width: \"280px\",\n borderBottom: \"1px solid\"\n },\n TABLE_DETAILS: {\n height: \"240px\"\n },\n TABLE_DETAILS_HEADER_CELL: maxWidth => ({\n padding: \"2px 2px\",\n fontSize: \"11px\",\n textAlign: \"center\",\n lineHeight: \"1rem\",\n ...(maxWidth ? {\n maxWidth\n } : {})\n }),\n TABLE_DETAILS_DATA_CELL: textAlign => ({\n padding: \"2px 2px\",\n fontSize: \"11px\",\n ...(textAlign ? {\n textAlign\n } : {})\n }),\n TABLE_DETAILS_MORE_BUTTON: {\n borderRadius: \"25px\",\n height: \"20px\"\n },\n CARD_DETAILS_CONTAINER: {\n minWidth: \"1200px\",\n maxWidth: \"1400px\"\n },\n CARD_DETAILS_NAVIGATION_STACK: {\n width: \"100%\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Информация о плане\nconst PlanInfo = ({\n plan\n}) => {\n return /*#__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_6__[\"default\"], {\n sx: STYLES.PLAN_INFO_MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLAN_INFO_SUB\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"UDO_body1\",\n mt: 1\n }, \"\\u041D\\u043E\\u043C\\u0435\\u0440 \\u0431\\u043E\\u0440\\u0442\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle2\"\n }, plan.SNUMB)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLAN_INFO_SUB\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"UDO_body1\",\n mt: 1\n }, \"\\u0413\\u043E\\u0434 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle2\"\n }, plan.NYEAR))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_progress_box__WEBPACK_IMPORTED_MODULE_5__.ProgressBox, {\n progress: plan.NPROGRESS,\n detail: plan.SDETAIL,\n width: \"110px\",\n height: \"110px\",\n progressVariant: \"subtitle2\",\n detailVariant: \"body3\"\n }));\n};\n\n//Контроль свойств - Информация о плане\nPlanInfo.propTypes = {\n plan: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().object)\n};\n\n//Модель выпуска плана\nconst PlanProductCompositionModel = ({\n model,\n products,\n onProductSelect\n}) => {\n //При выборе детали на модели\n const handleProductClick = ({\n item\n }) => {\n const product = products.find(p => p.SMODEL_ID == item.id);\n if (product && onProductSelect) onProductSelect(product);\n };\n\n //Генерация содержимого\n return /*#__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_6__[\"default\"], {\n sx: STYLES.PRODUCT_SELECTOR_MODEL\n }, model ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_svg__WEBPACK_IMPORTED_MODULE_2__.P8PSVG, {\n data: atob(model),\n items: products.map(p => ({\n id: p.SMODEL_ID,\n backgroundColor: p.SMODEL_BG_COLOR || \"red\",\n desc: p.SNAME,\n title: p.SNAME\n })),\n fillOpacity: \"0.3\",\n onItemClick: handleProductClick\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle2\"\n }, \"\\u041C\\u043E\\u0434\\u0435\\u043B\\u044C \\u0438\\u0437\\u0434\\u0435\\u043B\\u0438\\u044F \\u043D\\u0435 \\u0437\\u0430\\u0433\\u0440\\u0443\\u0436\\u0435\\u043D\\u0430\")));\n};\n\n//Контроль свойств - Модель выпуска плана\nPlanProductCompositionModel.propTypes = {\n model: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().any),\n products: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().array),\n onProductSelect: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func)\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => ({\n stackProps: {\n justifyContent: \"center\"\n },\n cellStyle: STYLES.TABLE_DETAILS_HEADER_CELL([\"NREMN_LABOUR\", \"NAPPLICABILITY\"].includes(columnDef.name) ? \"90px\" : [\"NDEFICIT\"].includes(columnDef.name) ? \"55px\" : null)\n});\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef\n}) => ({\n cellStyle: STYLES.TABLE_DETAILS_DATA_CELL([\"SOPERATION\", \"SNOMEN\"].includes(columnDef.name) ? null : \"center\"),\n data: row[columnDef]\n});\n\n//Таблица детализации изделия\nconst ProductDetailsTable = ({\n plan,\n product,\n stored,\n noProductMessage,\n noDataFoundMessage,\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n plan: null,\n product: null,\n orders: null,\n pageNumber: 1\n });\n\n //Собственное состояние - данные таблицы\n const {\n data,\n isLoading\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useProductDetailsTable)(state.plan, state.product, state.orders, state.pageNumber, stored);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setState(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setState(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1\n }));\n\n //При изменении изделия\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setState(pv => ({\n ...pv,\n plan,\n product,\n orders: null,\n pageNumber: 1\n }));\n }, [product, plan]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.BOX_INFO_SUB(!product || data.rows.length === 0)\n }, !product ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"UDO_body2\"\n }, noProductMessage) : /*#__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_9__[\"default\"], {\n direction: \"row\",\n spacing: 2,\n justifyContent: \"center\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n size: 18,\n sx: {\n opacity: isLoading ? 1 : 0\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"h4\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, title))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n noDataFoundText: isLoading || !data.init ? \"\" : noDataFoundMessage,\n containerComponentProps: {\n sx: STYLES.TABLE_DETAILS,\n elevation: 0\n },\n columnsDef: data.columnsDef,\n rows: data.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: data.morePages,\n morePagesBtnProps: {\n sx: STYLES.TABLE_DETAILS_MORE_BUTTON\n },\n fixedHeader: true,\n reloading: false,\n dataCellRender: dataCellRender,\n headCellRender: headCellRender,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged\n }))));\n};\n\n//Контроль свойств - Таблица детализации изделия\nProductDetailsTable.propTypes = {\n plan: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number).isRequired,\n product: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number),\n stored: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n noProductMessage: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n noDataFoundMessage: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация по объекту\nconst PlanDetail = ({\n plan,\n disableNavigatePrev = false,\n disableNavigateNext = false,\n onNavigate,\n onBack\n}) => {\n //Собственное состояние - данные производственных составов SVG\n const [costProductComposition, setCostProductComposition] = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useCostProductComposition)(plan.NRN);\n\n //Выбор элемента изделия\n const setProduct = product => {\n setCostProductComposition(pv => ({\n ...pv,\n selectedProduct: product ? {\n ...product\n } : null\n }));\n };\n\n //При навигации между карточками\n const handleNavigate = direction => {\n setProduct(null);\n if (onNavigate) onNavigate(direction);\n };\n\n //Формируем представление\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n maxWidth: false,\n sx: STYLES.CARD_DETAILS_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n container: true,\n direction: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n spacing: 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n sx: STYLES.CARD_DETAILS_NAVIGATION_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n disabled: disableNavigatePrev,\n onClick: () => handleNavigate(-1)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"navigate_before\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n xs: 10\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n maxWidth: false\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onBack ? onBack() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"chevron_left\"), \"\\u041D\\u0430\\u0437\\u0430\\u0434\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n container: true,\n spacing: 2,\n sx: {\n paddingTop: \"5px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n xs: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.BOX_INFO_MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProductDetailsTable, {\n plan: plan.NRN,\n product: costProductComposition.selectedProduct?.NRN,\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DG_BY_PRDCMPSP_GET\",\n noProductMessage: \"Укажите элемент модели, чтобы увидеть информацию о маршрутных картах\",\n noDataFoundMessage: \"Маршрутные карты не найдены\",\n title: \"Маршрутные карты\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.BOX_INFO_MAIN,\n mt: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProductDetailsTable, {\n plan: plan.NRN,\n product: costProductComposition.selectedProduct?.NRN,\n stored: \"PKG_P8PANELS_MECHREC.FCDELIVSH_DG_BY_PRDCMPSP_GET\",\n noProductMessage: \"Укажите элемент модели, чтобы увидеть информацию о комплектовочных ведомостях\",\n noDataFoundMessage: \"Комплектовочные ведомости не найдены\",\n title: \"Дефицит комплектации\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n xs: 7\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.DETAIL_INFO\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanInfo, {\n plan: plan\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PRODUCT_SELECTOR_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanProductCompositionModel, {\n model: costProductComposition.model,\n products: costProductComposition.products,\n onProductSelect: setProduct\n })))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n sx: STYLES.CARD_DETAILS_NAVIGATION_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n disabled: disableNavigateNext,\n onClick: () => handleNavigate(1)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"navigate_next\"))))));\n};\n\n//Контроль свойств - Детализация по объекту\nPlanDetail.propTypes = {\n plan: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().object),\n disableNavigatePrev: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().bool),\n disableNavigateNext: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().bool),\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func),\n onBack: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plan_detail.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/components/plans_list.js":
+/*!*******************************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/components/plans_list.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 */ PlansList: () => (/* binding */ PlansList)\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/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\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 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 _plans_list_item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./plans_list_item */ \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.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 DEFAULT_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n PLAN_DOCUMENTS_LIST: {\n minWidth: \"1024px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список планов\nconst PlansList = ({\n plans,\n pageSize = DEFAULT_PAGE_SIZE,\n onItemClick\n}) => {\n //Состояние прокрутки списка отображаемых планов\n const [scroll, setScroll] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n\n //Отработка нажатия на прокрутку списка планов влево\n const handleScrollLeft = () => setScroll(pv => pv <= 1 ? 0 : pv - 1);\n\n //Отработка нажатия на прокрутку списка планов вправо\n const handleScrollRight = () => setScroll(pv => pv + pageSize >= plans.length ? pv : pv + 1);\n\n //Сборка представления\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n container: true,\n direction: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n spacing: 2,\n sx: STYLES.PLAN_DOCUMENTS_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: handleScrollLeft,\n disabled: scroll <= 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"navigate_before\"))), plans.map((el, i) => i >= scroll && i < scroll + pageSize ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n item: true,\n key: `${el.NRN}_${i}`,\n xs: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_plans_list_item__WEBPACK_IMPORTED_MODULE_1__.PlansListItem, {\n card: el,\n cardIndex: i,\n onClick: (card, cardIndex) => onItemClick ? onItemClick(card, cardIndex) : null\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: handleScrollRight,\n disabled: scroll + pageSize >= plans.length\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"navigate_next\")))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: prop_types__WEBPACK_IMPORTED_MODULE_6___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_6___default().object)),\n pageSize: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number),\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plans_list.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/components/plans_list_item.js":
+/*!************************************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/components/plans_list_item.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 */ PlansListItem: () => (/* binding */ PlansListItem)\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__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/ImageList/ImageList.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ImageListItem/ImageListItem.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_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _progress_box__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./progress_box */ \"./app/panels/mech_rec_assembly_mon/components/progress_box.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 CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n gap: \"24px\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n cursor: \"pointer\"\n },\n IMAGE_BOX: {\n width: \"180px\",\n height: \"180px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n display: \"flex\"\n },\n IMAGE_LIST_ITEM: {\n textAlign: \"center\"\n },\n IMAGE_IMG: {\n width: \"160px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Изображение для элемента\nconst PlansListItemImage = ({\n card\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.IMAGE_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"masonry\",\n cols: 1,\n gap: 8\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: 1,\n sx: STYLES.IMAGE_LIST_ITEM\n }, card[\"BIMAGE\"] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: `data:image/png;base64,${card[\"BIMAGE\"]}`,\n loading: \"lazy\",\n style: STYLES.IMAGE_IMG\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n fontSize: \"5rem\"\n }\n }, \"construction\"))));\n};\n\n//Контроль свойств - Изображение для элемента\nPlansListItemImage.propTypes = {\n card: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Элемент списка планов\nconst PlansListItem = ({\n card,\n cardIndex,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.CONTAINER,\n onClick: () => onClick ? onClick(card, cardIndex) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansListItemImage, {\n card: card\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n textAlign: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"UDO_body1\",\n color: \"text.secondary.fontColor\"\n }, \"\\u041D\\u043E\\u043C\\u0435\\u0440 \\u0431\\u043E\\u0440\\u0442\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"h2\"\n }, card.SNUMB)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_progress_box__WEBPACK_IMPORTED_MODULE_1__.ProgressBox, {\n progress: card.NPROGRESS,\n detail: card.SDETAIL,\n width: \"155px\",\n height: \"155px\",\n progressVariant: \"h3\",\n detailVariant: \"UDO_body2\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"UDO_body1\",\n color: \"text.secondary.fontColor\"\n }, \"\\u0413\\u043E\\u0434 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle1\",\n mt: -1\n }, card.NYEAR)));\n};\n\n//Контроль свойств - Элемент списка планов\nPlansListItem.propTypes = {\n card: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object),\n cardIndex: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plans_list_item.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/components/progress_box.js":
+/*!*********************************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/components/progress_box.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 */ ProgressBox: () => (/* binding */ ProgressBox)\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_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.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 PROGRESS_BOX: (width, height) => ({\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n margin: \"0px 32px\",\n borderRadius: \"50%\",\n ...(width ? {\n width\n } : {}),\n ...(height ? {\n height\n } : {})\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Информация по прогрессу объекта\nconst ProgressBox = ({\n progress,\n detail,\n width,\n height,\n progressVariant,\n detailVariant\n}) => {\n //Определяем цвет тени\n let boxShadow = \"0 0 30px #d3d3d3\";\n switch (true) {\n case progress >= 70:\n boxShadow = \"0 0 30px #21d21e66\";\n break;\n case progress >= 40:\n boxShadow = \"0 0 30px #fddd3566\";\n break;\n case progress >= 10:\n boxShadow = \"0 0 30px #ea5c4966\";\n break;\n }\n\n //Возвращаем содержимое\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n sx: STYLES.PROGRESS_BOX(width, height),\n boxShadow: boxShadow\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n variant: progressVariant\n }, `${progress}%`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n variant: detailVariant\n }, detail));\n};\n\n//Контроль свойств - Информация по прогрессу объекта\nProgressBox.propTypes = {\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\n detail: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n width: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number)]),\n height: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number)]),\n progressVariant: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n detailVariant: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/progress_box.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/hooks.js":
+/*!***************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/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 */ useCostProductComposition: () => (/* binding */ useCostProductComposition),\n/* harmony export */ useFilteredPlanCtlgs: () => (/* binding */ useFilteredPlanCtlgs),\n/* harmony export */ useMechRecAssemblyMon: () => (/* binding */ useMechRecAssemblyMon),\n/* harmony export */ useProductDetailsTable: () => (/* binding */ useProductDetailsTable)\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 _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __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 DATA_GRID_PAGE_SIZE = 50;\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//Хук для основной таблицы панели\nconst useMechRecAssemblyMon = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlg: {},\n plans: [],\n plansLoaded: false,\n selectedPlan: {}\n });\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.FCPRODPLAN_AM_CTLG_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 loadPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NCRN => {\n if (NCRN) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_GET\",\n args: {\n NCRN: NCRN\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_INFO\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLAN_INFO || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [executeStored]);\n\n //Выбор каталога планов\n const selectPlanCtlg = planCtlg => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: {\n ...planCtlg\n },\n selectedPlan: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlanCtlg = () => setState(pv => ({\n ...pv,\n selectedPlanCtlg: {},\n selectedPlan: {},\n showPlanList: false\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 //Если каталог выбран\n if (state.selectedPlanCtlg) {\n loadPlans(state.selectedPlanCtlg.NRN);\n } else {\n setState(pv => ({\n ...pv,\n plans: [],\n plansLoaded: false\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.selectedPlanCtlg]);\n return [state, setState, selectPlanCtlg, unselectPlanCtlg];\n};\n\n//Хук для информации по производственным составам\nconst useCostProductComposition = plan => {\n //Собственное состояние\n let [costProductComposition, setCostProductComposition] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n showPlanList: false,\n products: [],\n productsLoaded: false,\n model: null,\n selectedProduct: null\n });\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 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODCMP_DETAILS_GET\",\n args: {\n NFCPRODPLAN: plan\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODCMP\"\n });\n setCostProductComposition(pv => ({\n ...pv,\n products: [...(data?.XFCPRODCMP || [])],\n productsLoaded: true,\n model: data?.BMODEL,\n selectedProduct: null\n }));\n };\n if (plan) loadData();\n }, [plan, executeStored]);\n\n //Вернём данные\n return [costProductComposition, setCostProductComposition];\n};\n\n//Хук для таблицы детализации изделия\nconst useProductDetailsTable = (plan, product, orders, pageNumber, stored) => {\n //Собственное состояние - флаг загрузки\n const [isLoading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Собственное состояние - таблица данных\n const [data, setData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n columnsDef: [],\n rows: [],\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_1__[\"BackEndСtx\"]);\n\n //Загрузка данных при изменении зависимостей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const data = await executeStored({\n stored,\n args: {\n NPRODCMPSP: product,\n NFCPRODPLAN: plan,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: pageNumber == 1 ? 1 : 0\n },\n respArg: \"COUT\",\n loader: false\n });\n setData(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE,\n init: true\n }));\n } finally {\n setLoading(false);\n }\n };\n if (plan && product) loadData();\n }, [plan, product, orders, pageNumber, stored, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Вернём данные\n return {\n data,\n isLoading\n };\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/hooks.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/index.js":
+/*!***************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/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 _mech_rec_assembly_mon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mech_rec_assembly_mon */ \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель мониторинга сборки изделий\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _mech_rec_assembly_mon__WEBPACK_IMPORTED_MODULE_0__.MechRecAssemblyMon;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/index.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js":
+/*!*******************************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.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 */ MechRecAssemblyMon: () => (/* binding */ MechRecAssemblyMon)\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_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.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_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_styles__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/ThemeProvider.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _components_plans_list__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/plans_list */ \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\");\n/* harmony import */ var _components_plan_detail__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/plan_detail */ \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\");\n/* harmony import */ var _styles_themes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./styles/themes */ \"./app/panels/mech_rec_assembly_mon/styles/themes.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_assembly_mon/hooks.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 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 PLANS_LIST_BOX: {\n paddingTop: \"20px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\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_6__[\"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_7__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\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_10__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"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({\n NRN: p.NRN,\n SNAME: p.SNAME,\n NMIN_YEAR: p.NMIN_YEAR,\n NMAX_YEAR: p.NMAX_YEAR\n }) : 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.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"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_14___default().array),\n selectedPlanCtlg: (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().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель мониторинга сборки изделий\nconst MechRecAssemblyMon = () => {\n //Собственное состояние\n const [state, setState, selectPlanCtlg, unselectPlanCtlg] = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useMechRecAssemblyMon)();\n\n //Состояние фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveDocs: false\n });\n\n //Состояние навигации по карточкам детализации\n const [planDetailNavigation, setPlanDetailNavigation] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n disableNavigatePrev: false,\n disableNavigateNext: false,\n currentPlanIndex: 0\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handlePlanCtlgClick = planCtlg => {\n if (state.selectedPlanCtlg.NRN != planCtlg.NRN) selectPlanCtlg(planCtlg);else unselectPlanCtlg();\n };\n\n //Перемещение к нужному плану\n const navigateToPlan = planIndex => {\n if (planIndex < 0) planIndex = 0;\n if (planIndex > state.plans.length - 1) planIndex = state.plans.length - 1;\n setState(pv => ({\n ...pv,\n selectedPlan: {\n ...state.plans[planIndex]\n }\n }));\n setPlanDetailNavigation(pv => ({\n ...pv,\n disableNavigatePrev: planIndex == 0 ? true : false,\n disableNavigateNext: planIndex == state.plans.length - 1 ? true : false,\n currentPlanIndex: planIndex\n }));\n };\n\n //Обработка нажатия на документ плана\n const handlePlanClick = (plan, planIndex) => navigateToPlan(planIndex);\n\n //Обработка нажатия на кнопку \"Назад\"\n const handlePlanDetailBackClick = () => {\n setState(pv => ({\n ...pv,\n selectedPlan: {}\n }));\n };\n\n //Обработка навигации из карточки с деталями плана\n const handlePlanDetailNavigateClick = direction => navigateToPlan(planDetailNavigation.currentPlanIndex + direction);\n\n //Формирование текста заголовка\n const title = `${state.selectedPlanCtlg.SNAME} на ${state.selectedPlanCtlg.NMIN_YEAR} ${state.selectedPlanCtlg.NMIN_YEAR == state.selectedPlanCtlg.NMAX_YEAR ? \"г.\" : `- ${state.selectedPlanCtlg.NMAX_YEAR} г.г.`} `;\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_styles__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n theme: _styles_themes__WEBPACK_IMPORTED_MODULE_4__.theme\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 }, \"\\u041F\\u0440\\u043E\\u0433\\u0440\\u0430\\u043C\\u043C\\u044B\"), /*#__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.NRN,\n filter: filter,\n setFilter: setFilter,\n onClick: handlePlanCtlgClick\n })), state.init == true ? state.selectedPlanCtlg.NRN ? /*#__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 variant: \"h3\",\n align: \"center\",\n color: \"text.title.fontColor\",\n py: 2\n }, title), state.plansLoaded == true ? state.selectedPlan.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_plan_detail__WEBPACK_IMPORTED_MODULE_3__.PlanDetail, {\n plan: state.selectedPlan,\n disableNavigatePrev: planDetailNavigation.disableNavigatePrev,\n disableNavigateNext: planDetailNavigation.disableNavigateNext,\n onNavigate: handlePlanDetailNavigateClick,\n onBack: handlePlanDetailBackClick\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.PLANS_LIST_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_plans_list__WEBPACK_IMPORTED_MODULE_2__.PlansList, {\n plans: state.plans,\n onItemClick: handlePlanClick\n })) : null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения его спецификаций\"\n }) : null));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_assembly_mon/styles/themes.js":
+/*!***********************************************************!*\
+ !*** ./app/panels/mech_rec_assembly_mon/styles/themes.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 */ theme: () => (/* binding */ theme)\n/* harmony export */ });\n/* harmony import */ var _mui_material_styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/createTheme.js\");\n //Интерфейсные элементы\n\n//Описание темы\nconst theme = (0,_mui_material_styles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n palette: {\n text: {\n title: {\n fontColor: \"rgba(0, 0, 0, 0.65)\"\n },\n secondary: {\n fontColor: \"rgba(0, 0, 0, 0.298)\"\n }\n }\n },\n typography: {\n h1: {\n fontSize: \"40px\",\n fontWeight: 400,\n textAlign: \"center\"\n },\n h2: {\n fontSize: \"40px\",\n fontWeight: 700,\n textAlign: \"center\"\n },\n h3: {\n fontSize: \"30px\",\n fontWeight: 700,\n textAlign: \"center\"\n },\n h4: {\n fontSize: \"16px\",\n fontWeight: 400,\n textAlign: \"center\"\n },\n subtitle1: {\n fontSize: \"30px\",\n fontWeight: 400,\n textAlign: \"center\"\n },\n subtitle2: {\n fontSize: \"20px\",\n fontWeight: 700,\n textAlign: \"center\"\n },\n UDO_body1: {\n fontSize: \"14px\",\n fontWeight: 400,\n textAlign: \"center\",\n wordWrap: \"break-word\",\n letterSpacing: \"0.00938em\",\n lineHeight: \"1.5\"\n },\n UDO_body2: {\n fontSize: \"12px\",\n fontWeight: 400,\n whiteSpace: \"pre-line\",\n textAlign: \"center\",\n wordWrap: \"break-word\",\n letterSpacing: \"0.00938em\",\n lineHeight: \"1.5\"\n },\n body3: {\n fontSize: \"9px\",\n whiteSpace: \"pre-line\",\n textAlign: \"center\"\n }\n }\n});\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/styles/themes.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_cost_jobs_manage/backend.js":
+/*!*********************************************************!*\
+ !*** ./app/panels/mech_rec_cost_jobs_manage/backend.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 */ updatingSelected: () => (/* binding */ updatingSelected),\n/* harmony export */ useCostEquipment: () => (/* binding */ useCostEquipment),\n/* harmony export */ useCostJobsSpecs: () => (/* binding */ useCostJobsSpecs),\n/* harmony export */ useCostRouteLists: () => (/* binding */ useCostRouteLists)\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 _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\nconst DATA_GRID_PAGE_FCEQUIPMENT = 10;\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Переиницализация выбранных значений строк (необходимо при сортировке или добавлении записей строк)\nconst updatingSelected = (rows, selectedRows) => {\n //Если полученный массив строк не пустой\n if (rows.length > 0 && selectedRows.length > 0) {\n //Устанавливаем выбор там, где он был установлен\n let updatedRows = rows.map(item => {\n if (selectedRows.includes(item.NRN)) {\n return {\n ...item,\n NSELECT: 1\n };\n } else {\n return item;\n }\n });\n return updatedRows;\n }\n //Возвращаем\n return rows;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для таблицы маршрутных листов\nconst useCostRouteLists = (task, processIdent) => {\n //Собственное состояние - таблица данных\n const [costRouteLists, setCostRouteLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n task: null,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRows: [],\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_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costRouteLists.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_FCROUTLST_DG_GET\",\n args: {\n NFCJOBS: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setCostRouteLists(pv => ({\n ...pv,\n task: task,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? updatingSelected([...(data.XROWS || [])], costRouteLists.selectedRows) : updatingSelected([...pv.rows, ...(data.XROWS || [])], costRouteLists.selectedRows),\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costRouteLists.reload, costRouteLists.filters, costRouteLists.orders, costRouteLists.dataLoaded, costRouteLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Добавление/удаление записи в селектлисте\n const modifySelectList = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n if (prms.NSELECT) {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.SELECTLIST_FCROUTLST_ADD\",\n args: {\n NIDENT: processIdent,\n NFCROUTLST: prms.NFCROUTLST\n }\n });\n } else {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.SELECTLIST_FCROUTLST_DEL\",\n args: {\n NIDENT: processIdent,\n NFCROUTLST: prms.NFCROUTLST\n }\n });\n }\n } catch (e) {\n throw new Error(e.message);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costRouteLists.reload, loadData]);\n\n //При изменении сменного задания\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setCostRouteLists(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [task]);\n return [costRouteLists, setCostRouteLists, modifySelectList];\n};\n\n//Хук для таблицы операций\nconst useCostJobsSpecs = (task, fcroutlstList, processIdent) => {\n //Собственное состояние - таблица данных\n const [costJobsSpecs, setCostJobsSpecs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n task: null,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRows: [],\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_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costJobsSpecs.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_DG_GET\",\n args: {\n NFCJOBS: task,\n NIDENT: processIdent,\n //SFCROUTLST_LIST: fcroutlstList.join(\",\"),\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costJobsSpecs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costJobsSpecs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costJobsSpecs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setCostJobsSpecs(pv => ({\n ...pv,\n task: task,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? updatingSelected([...(data.XROWS || [])], costJobsSpecs.selectedRows) : updatingSelected([...pv.rows, ...(data.XROWS || [])], costJobsSpecs.selectedRows),\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costJobsSpecs.reload, costJobsSpecs.filters, costJobsSpecs.orders, costJobsSpecs.dataLoaded, costJobsSpecs.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Выдача задания\n const issueCostJobsSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_ISSUE\",\n args: {\n NFCJOBS: prms.NFCJOBS,\n SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costJobsSpecs.reload, loadData]);\n\n //При изменении сменного задания\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setCostJobsSpecs(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n }, [task, fcroutlstList]);\n return [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs];\n};\n\n//Хук для таблицы рабочих центров\nconst useCostEquipment = () => {\n //Собственное состояние - таблица данных\n const [costEquipment, setCostEquipment] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRows: [],\n selectedLoaded: false,\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_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costEquipment.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCEQUIPMENT_DG_GET\",\n args: {\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costEquipment.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costEquipment.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_FCEQUIPMENT,\n NINCLUDE_DEF: costEquipment.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setCostEquipment(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? updatingSelected([...(data.XROWS || [])], costEquipment.selectedRows) : updatingSelected([...pv.rows, ...(data.XROWS || [])], costEquipment.selectedRows),\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_FCEQUIPMENT\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costEquipment.reload, costEquipment.filters, costEquipment.orders, costEquipment.dataLoaded, costEquipment.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Включение оборудования в операции\n const includeCostEquipment = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_INC_FCEQUIPMENT\",\n args: {\n NFCEQUIPMENT: prms.NFCEQUIPMENT,\n NFCJOBS: prms.NFCJOBS,\n SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //Исключение оборудования из операции\n const excludeCostEquipment = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_EXC_FCEQUIPMENT\",\n args: {\n NFCEQUIPMENT: prms.NFCEQUIPMENT,\n NFCJOBS: prms.NFCJOBS,\n SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costEquipment.reload, loadData]);\n return [costEquipment, setCostEquipment, includeCostEquipment, excludeCostEquipment];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/backend.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js":
+/*!**********************************************************!*\
+ !*** ./app/panels/mech_rec_cost_jobs_manage/fcjobssp.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 */ CostJobsSpecsDataGrid: () => (/* binding */ CostJobsSpecsDataGrid),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender)\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_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/Checkbox/Checkbox.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/Grid/Grid.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/Button/Button.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 _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/panels/mech_rec_cost_jobs_manage/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 Компонент панели: Таблица информации об операциях сменного задания\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Собственные хуки таблиц\n\n//---------\n//Константы\n//---------\n\nconst sUnitCostRouteLists = \"CostRouteLists\"; //Мнемокод раздела маршрутных листов\nconst sUnitCostJobsSpecs = \"CostJobsSpecs\"; //Мнемокод раздела операций\nconst sUnitCostEquipment = \"CostEquipment\"; //Мнемокод раздела рабочих центров\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\"\n },\n TABLE: {\n paddingTop: \"15px\"\n },\n TABLE_SUM: {\n textAlign: \"right\",\n paddingTop: \"5px\",\n paddingRight: \"15px\"\n },\n TABLE_BUTTONS: {\n display: \"flex\",\n justifyContent: \"flex-end\"\n },\n CHECK_BOX: {\n textAlign: \"center\"\n },\n OPERATIONS_SEPARATOR: {\n padding: \"3px 0px\",\n backgroundColor: \"lightblue\"\n },\n INFORMATION_HALF: {\n minWidth: \"50%\",\n maxWidth: \"50%\",\n textAlign: \"center\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование списка отмеченных записей\nfunction selectedReducer(accumulator, current) {\n if (current.NSELECT == 1) {\n accumulator.push(current.NRN);\n }\n return accumulator;\n}\n\n//Форматирование значения ячейки\nconst dataCellRender = ({\n row,\n columnDef,\n handleSelectChange,\n sUnit,\n selectedEquip\n}) => {\n //Инициализируем доступность выбора\n let disabled = false;\n //Если это рабочие центры\n if (sUnit === sUnitCostEquipment) {\n //Для колонки выбора\n if (columnDef.name === \"NSELECT\") {\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.CHECK_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n disabled: selectedEquip.length === 1 && selectedEquip[0] !== row[\"NRN\"],\n checked: row[columnDef.name]\n //checked={row[columnDef.name] === 1}\n ,\n onChange: () => handleSelectChange(row[\"NRN\"], sUnit, row[\"NCOEFF\"] <= row[\"NLOADING\"])\n }))\n };\n }\n //Если оборудование загружено\n if (row[\"NCOEFF\"] <= row[\"NLOADING\"]) {\n //Если поле не поле выбора\n if (columnDef.name !== \"NSELECT\") {\n return {\n cellStyle: {\n color: \"lightgrey\"\n },\n data: row[columnDef.name]\n };\n }\n }\n }\n //Если это операции\n if (sUnit === sUnitCostJobsSpecs) {\n //Если \"Оборудование план\" операции сходится с выбранным оборудованием\n if (selectedEquip.includes(row[\"NEQUIP_PLAN\"])) {\n //Если колонка выбора\n if (columnDef.name === \"NSELECT\") {\n return {\n cellStyle: {\n backgroundColor: \"#bce0de\"\n },\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.CHECK_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n disabled: disabled,\n checked: row[columnDef.name]\n //checked={row[columnDef.name] === 1}\n ,\n onChange: () => handleSelectChange(row[\"NRN\"], sUnit)\n }))\n };\n } else {\n return {\n cellStyle: {\n backgroundColor: \"#bce0de\"\n },\n data: row[columnDef.name]\n };\n }\n }\n }\n //Для колонки выбора\n if (columnDef.name === \"NSELECT\") {\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.CHECK_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n disabled: disabled,\n checked: row[columnDef.name]\n //checked={row[columnDef.name] === 1}\n ,\n onChange: () => handleSelectChange(row[\"NRN\"], sUnit)\n }))\n };\n }\n return {\n data: row[columnDef.name]\n };\n};\n\n//Генерация представления ячейки заголовка группы\nconst headCellRender = ({\n columnDef\n}) => {\n if (columnDef.name === \"NSELECT\") {\n return {\n stackStyle: {\n padding: \"2px\",\n justifyContent: \"space-around\"\n },\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"done\")\n };\n } else {\n return {\n stackStyle: {\n padding: \"2px\"\n },\n data: columnDef.caption\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица информации об операциях сменного задания\nconst CostJobsSpecsDataGrid = ({\n task,\n processIdent,\n clearSelectlist\n}) => {\n //Собственное состояние - таблица данных маршрутных листов\n const [costRouteLists, setCostRouteLists, modifySelectList] = (0,_backend__WEBPACK_IMPORTED_MODULE_3__.useCostRouteLists)(task, processIdent);\n\n //Собственное состояние - таблица данных операций\n const [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs] = (0,_backend__WEBPACK_IMPORTED_MODULE_3__.useCostJobsSpecs)(task, costRouteLists.selectedRows, processIdent);\n\n //Собственное состояние - таблица рабочих центров\n const [costEquipment, setCostEquipment, includeCostEquipment, excludeCostEquipment] = (0,_backend__WEBPACK_IMPORTED_MODULE_3__.useCostEquipment)();\n\n //При изменении состояния сортировки маршрутных листов\n const costRouteListOrderChanged = ({\n orders\n }) => setCostRouteLists(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц маршрутных листов\n const costRouteListPagesCountChanged = () => setCostRouteLists(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При изменении состояния сортировки операций\n const costJobsSpecOrderChanged = ({\n orders\n }) => setCostJobsSpecs(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц операций\n const costJobsSpecPagesCountChanged = () => setCostJobsSpecs(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При изменении состояния сортировки рабочих центров\n const costEquipmentOrderChanged = ({\n orders\n }) => setCostEquipment(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц рабочих центров\n const costEquipmentPagesCountChanged = () => setCostEquipment(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При включении оборудования в операции\n const costJobsSpecIncludeCostEquipment = () => {\n //Делаем асинхронно, чтобы при ошибке ничего не обновлять\n const includeAsync = async () => {\n //Включаем оборудование в операции\n try {\n await includeCostEquipment({\n NFCEQUIPMENT: costEquipment.selectedRows[0],\n NFCJOBS: task,\n SFCJOBSSP_LIST: costJobsSpecs.selectedRows.join(\";\")\n });\n //Необходимо обновить все данные\n setCostJobsSpecs(pv => ({\n ...pv,\n selectedRows: [],\n reload: true\n }));\n setCostEquipment(pv => ({\n ...pv,\n selectedRows: [],\n selectedLoaded: false,\n reload: true\n }));\n } catch (e) {\n throw new Error(e.message);\n }\n };\n //Включаем оборудование асинхронно\n includeAsync();\n };\n\n //При исключении оборудования из операции\n const costJobsSpecExcludeCostEquipment = () => {\n //Делаем асинхронно, чтобы при ошибке ничего не обновлять\n const excludeAsync = async () => {\n //Включаем оборудование в операции\n try {\n await excludeCostEquipment({\n NFCEQUIPMENT: costEquipment.selectedRows[0],\n NFCJOBS: task,\n SFCJOBSSP_LIST: costJobsSpecs.selectedRows.join(\";\")\n });\n //Необходимо обновить данные о маршрутных листах и оборудовании\n setCostJobsSpecs(pv => ({\n ...pv,\n selectedRows: [],\n reload: true\n }));\n setCostEquipment(pv => ({\n ...pv,\n selectedRows: [],\n reload: true\n }));\n } catch (e) {\n throw new Error(e.message);\n }\n };\n //Исключаем операции асинхронно\n excludeAsync();\n };\n\n //Выдача задания операции\n const costJobsSpecIssue = () => {\n //Делаем асинхронно, чтобы при ошибке ничего не обновлять\n const issueAsync = async () => {\n //Включаем оборудование в операции\n try {\n await issueCostJobsSpecs({\n NFCJOBS: task,\n SFCJOBSSP_LIST: costJobsSpecs.selectedRows.join(\";\")\n });\n //Необходимо обновить данные о маршрутных листах и оборудовании\n clearSelectlist(processIdent);\n setCostRouteLists(pv => ({\n ...pv,\n selectedRows: [],\n reload: true\n }));\n setCostEquipment(pv => ({\n ...pv,\n selectedRows: [],\n reload: true\n }));\n } catch (e) {\n throw new Error(e.message);\n }\n };\n //Выдаем задание асинхронно\n issueAsync();\n };\n\n //При изменение состояния выбора\n const handleSelectChange = (NRN, sUnit, selectedLoaded) => {\n //Инициализируем строки таблицы\n let rows = [];\n //Индекс элемента в массиве\n let indexRow = null;\n //Исходим от раздела\n switch (sUnit) {\n //Маршрутные листы\n case sUnitCostRouteLists:\n //Инициализируем маршрутными листами\n rows = costRouteLists.rows;\n //Определяем индекс элемента в массиве\n indexRow = rows.findIndex(obj => obj.NRN == NRN);\n //Изменяем значение выбора\n rows[indexRow].NSELECT = !rows[indexRow].NSELECT;\n //Добавляем/удаляем маршрутный лист из селектлиста\n modifySelectList({\n NFCROUTLST: NRN,\n NSELECT: rows[indexRow].NSELECT\n });\n //Актуализируем строки\n setCostRouteLists(pv => ({\n ...pv,\n rows: rows,\n selectedRows: rows.reduce(selectedReducer, [])\n }));\n //Выходим\n break;\n //Операции\n case sUnitCostJobsSpecs:\n //Инициализируем операциями\n rows = costJobsSpecs.rows;\n //Определяем индекс элемента в массиве\n indexRow = rows.findIndex(obj => obj.NRN == NRN);\n //Изменяем значение выбора\n rows[indexRow].NSELECT = !rows[indexRow].NSELECT;\n //Актуализируем строки\n setCostJobsSpecs(pv => ({\n ...pv,\n rows: rows,\n selectedRows: rows.reduce(selectedReducer, [])\n }));\n //Выходим\n break;\n //Рабочие центры\n case sUnitCostEquipment:\n //Инициализируем рабочими центрами\n rows = costEquipment.rows;\n //Определяем индекс элемента в массиве\n indexRow = rows.findIndex(obj => obj.NRN == NRN);\n //Изменяем значение выбора\n rows[indexRow].NSELECT = !rows[indexRow].NSELECT;\n //Актуализируем строки\n setCostEquipment(pv => ({\n ...pv,\n rows: rows,\n selectedRows: rows.reduce(selectedReducer, []),\n selectedLoaded: selectedLoaded\n }));\n //Выходим\n break;\n default:\n return;\n }\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 container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n item: true,\n sx: STYLES.INFORMATION_HALF\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\"\n }, \"\\u041C\\u0430\\u0440\\u0448\\u0440\\u0443\\u0442\\u043D\\u044B\\u0435 \\u043B\\u0438\\u0441\\u0442\\u044B\"), costRouteLists.dataLoaded ? /*#__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 sx: STYLES.TABLE_BUTTONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n variant: \"contained\",\n size: \"small\",\n disabled: costJobsSpecs.selectedRows.length === 0,\n onClick: costJobsSpecIssue\n }, \"\\u0412\\u044B\\u0434\\u0430\\u0442\\u044C \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u044F\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE\n }, /*#__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: costRouteLists.columnsDef,\n rows: costRouteLists.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: costRouteLists.morePages,\n reloading: costRouteLists.reload,\n onOrderChanged: costRouteListOrderChanged,\n onPagesCountChanged: costRouteListPagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handleSelectChange,\n sUnit: sUnitCostRouteLists\n }),\n headCellRender: prms => headCellRender({\n ...prms\n })\n })), costRouteLists.selectedRows.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 sx: STYLES.OPERATIONS_SEPARATOR\n }, \"\\u041E\\u043F\\u0435\\u0440\\u0430\\u0446\\u0438\\u0438 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0445 \\u043C\\u0430\\u0440\\u0448\\u0440\\u0443\\u0442\\u043D\\u044B\\u0445 \\u043B\\u0438\\u0441\\u0442\\u043E\\u0432\"), /*#__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: costJobsSpecs.columnsDef,\n rows: costJobsSpecs.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: costJobsSpecs.morePages,\n reloading: costJobsSpecs.reload,\n onOrderChanged: costJobsSpecOrderChanged,\n onPagesCountChanged: costJobsSpecPagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handleSelectChange,\n sUnit: sUnitCostJobsSpecs,\n selectedEquip: costEquipment.selectedRows\n }),\n headCellRender: prms => headCellRender({\n ...prms\n })\n }))) : null)) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n item: true,\n sx: STYLES.INFORMATION_HALF\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\"\n }, \"\\u0420\\u0430\\u0431\\u043E\\u0447\\u0438\\u0435 \\u0446\\u0435\\u043D\\u0442\\u0440\\u044B\"), costEquipment.dataLoaded ? /*#__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 sx: STYLES.TABLE_BUTTONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n variant: \"contained\",\n size: \"small\",\n disabled: costEquipment.selectedRows.length !== 1 || costEquipment.selectedRows.length === 1 && costJobsSpecs.selectedRows.length === 0 || costEquipment.selectedLoaded,\n onClick: costJobsSpecIncludeCostEquipment\n }, \"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0432 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u0435\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n ml: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n variant: \"contained\",\n size: \"small\",\n disabled: costEquipment.selectedRows.length !== 1 || costEquipment.selectedRows.length === 1 && costJobsSpecs.selectedRows.length === 0,\n onClick: costJobsSpecExcludeCostEquipment\n }, \"\\u0418\\u0441\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0438\\u0437 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u044F\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TABLE\n }, /*#__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: costEquipment.columnsDef,\n rows: costEquipment.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: costEquipment.morePages,\n reloading: costEquipment.reload,\n onOrderChanged: costEquipmentOrderChanged,\n onPagesCountChanged: costEquipmentPagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handleSelectChange,\n sUnit: sUnitCostEquipment,\n selectedEquip: costEquipment.selectedRows\n }),\n headCellRender: prms => headCellRender({\n ...prms\n })\n })))) : null)));\n};\n\n//Контроль свойств - Таблица информации об операциях сменного задания\nCostJobsSpecsDataGrid.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n processIdent: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number),\n clearSelectlist: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_cost_jobs_manage/hooks.js":
+/*!*******************************************************!*\
+ !*** ./app/panels/mech_rec_cost_jobs_manage/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 */ useFilteredFcjobs: () => (/* binding */ useFilteredFcjobs)\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 useFilteredFcjobs = (jobs, filter) => {\n const filteredJobs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return jobs.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.jobName));\n }, [jobs, filter]);\n return filteredJobs;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/hooks.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_cost_jobs_manage/index.js":
+/*!*******************************************************!*\
+ !*** ./app/panels/mech_rec_cost_jobs_manage/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 _mech_rec_cost_jobs_manage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mech_rec_cost_jobs_manage */ \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.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_jobs_manage__WEBPACK_IMPORTED_MODULE_0__.MechRecCostJobs;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/index.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js":
+/*!***************************************************************************!*\
+ !*** ./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.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 */ MechRecCostJobs: () => (/* binding */ MechRecCostJobs)\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/TextField/TextField.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/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.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 _hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\");\n/* harmony import */ var _fcjobssp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fcjobssp */ \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.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//Стили\nconst STYLES = {\n JOBS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n JOBS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n JOBS_BUTTON: {\n position: \"absolute\"\n },\n JOBS_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 CONTAINER: {\n margin: \"5px 0px\",\n textAlign: \"center\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Список сменных заданий\nconst JobList = ({\n jobs = [],\n selectedJob,\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_5__[\"default\"], {\n sx: STYLES.JOBS_FINDER,\n name: \"jobFilter\",\n label: \"\\u0421\\u043C\\u0435\\u043D\\u043D\\u043E\\u0435 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u0435\",\n value: filter.jobName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n jobName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, jobs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedJob.NRN,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.JOBS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nJobList.propTypes = {\n jobs: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().array),\n selectedJob: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выдачи сменного задания\nconst MechRecCostJobs = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showJobList: false,\n jobList: [],\n jobListLoaded: false,\n selectedJob: {},\n processIdent: null,\n dataLoaded: false\n });\n\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n jobName: \"\"\n });\n\n //Массив отфильтрованных каталогов\n const filteredJobs = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useFilteredFcjobs)(state.jobList, filter);\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 {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingС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.FCJOBS_INIT\",\n args: {},\n respArg: \"COUT\",\n fullResponse: true,\n isArray: name => name === \"XFCJOBS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n jobList: [...(data.XPAYLOAD?.XFCJOBS || [])],\n jobListLoaded: true,\n processIdent: data.XPAYLOAD.XINFO.NPROCESS_IDENT\n }));\n }\n }, [state.init, executeStored]);\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 const clearSelectlist = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NIDENT => {\n try {\n await executeStored({\n stored: \"P_SELECTLIST_CLEAR\",\n args: {\n NIDENT: NIDENT\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //Выбор плана\n const selectJob = job => {\n //Очищаем селектлист\n clearSelectlist(state.processIdent);\n //Обновляем состояние\n setState(pv => ({\n ...pv,\n selectedJob: job,\n showJobList: false,\n dataLoaded: false\n }));\n };\n\n //Сброс выбора плана\n const unselectJob = () => {\n //Очищаем селектлист\n clearSelectlist(state.processIdent);\n //Обновляем состояние\n setState(pv => ({\n ...pv,\n selectedJob: {},\n showJobList: false,\n dataLoaded: false\n }));\n };\n\n //Обработка нажатия на элемент в списке планов\n const handleJobClick = job => {\n if (state.selectedJob.NRN != job.NRN) selectJob(job);else unselectJob();\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.JOBS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showJobList: !pv.showJobList\n }))\n }, \"\\u0421\\u043C\\u0435\\u043D\\u043D\\u044B\\u0435 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n anchor: \"left\",\n open: state.showJobList,\n onClose: () => setState(pv => ({\n ...pv,\n showJobList: false\n })),\n sx: STYLES.JOBS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(JobList, {\n jobs: filteredJobs,\n selectedJob: state.selectedJob,\n filter: filter,\n setFilter: setFilter,\n onClick: handleJobClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, state.selectedJob.NRN ? /*#__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_9__[\"default\"], {\n variant: \"h6\"\n }, `Сменное задание \"${state.selectedJob.SSUBDIV}\" на ${state.selectedJob.SPERIOD}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcjobssp__WEBPACK_IMPORTED_MODULE_4__.CostJobsSpecsDataGrid, {\n task: state.selectedJob.NRN,\n processIdent: state.processIdent,\n clearSelectlist: clearSelectlist\n })) : !state.selectedJob.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите сменное задание\"\n }) : null));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js?");
/***/ }),
@@ -3612,7 +4140,95 @@ 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_17__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_17__);\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/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.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/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardHeader/CardHeader.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.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\");\n/* harmony import */ var _datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./datagrids/fcroutlst */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\");\n/* harmony import */ var _datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./datagrids/incomefromdeps */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.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\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 SECOND_TABLE: {\n paddingTop: \"30px\"\n },\n TASK_DIALOG_CARD_CONTAINER: {\n padding: \"0px\"\n },\n TASK_DIALOG_LIST_ITEM_ICON: {\n justifyContent: \"center\"\n },\n TASK_DIALOG_ICON: {\n fontSize: \"2rem\"\n },\n TASK_DIALOG_ACTION_CONTAINER: {\n border: 1,\n borderColor: \"text.primary\",\n borderRadius: \"5px\",\n width: \"100%\"\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) => [\"numb\", \"title\"].includes(name) ? 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) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\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_9__[\"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_10__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\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_13__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"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_15__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"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_16__[\"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_17___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().func)\n};\n\n//Генерация диалога задачи\nconst taskDialogRenderer = ({\n task,\n taskColors,\n close,\n handleTaskDetailOpen\n}) => {\n //Стиль и описание для легенды\n const legendDesc = (0,_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.taskLegendDesc)({\n task,\n taskColors\n });\n //Элемент карточки задачи\n const cardItem = ({\n listItemsStyle = {},\n icon,\n primaryText = null,\n secondaryText = null\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n disablePadding: true,\n sx: listItemsStyle\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n sx: STYLES.TASK_DIALOG_LIST_ITEM_ICON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: STYLES.TASK_DIALOG_ICON\n }, icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n primary: primaryText,\n secondary: secondaryText\n })));\n //Собираем содержимое диалога\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n title: task.name,\n titleTypographyProps: {\n variant: \"h6\"\n },\n subheader: `${(0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateRF)(task.start)} - ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateRF)(task.end)}`,\n action: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n \"aria-label\": \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\",\n onClick: close\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"close\"))\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n sx: STYLES.TASK_DIALOG_CARD_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, cardItem({\n icon: \"fast_forward\",\n primaryText: `${task.start_fact} ${task.meas}`,\n secondaryText: \"Запущено\"\n }), cardItem({\n icon: \"assessment\",\n primaryText: `${task.main_quant} ${task.meas}`,\n secondaryText: \"Количество план\"\n }), cardItem({\n icon: \"verified\",\n primaryText: `${task.rel_fact} ${task.meas}`,\n secondaryText: \"Количество сдано\"\n }), cardItem({\n icon: \"date_range\",\n primaryText: task.rep_date_to,\n secondaryText: \"Дата выпуска план\"\n }), legendDesc ? cardItem({\n listItemsStyle: legendDesc.style,\n icon: \"palette\",\n secondaryText: legendDesc.text\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n disableSpacing: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n p: 2,\n display: \"flex\",\n justifyContent: \"center\",\n sx: STYLES.TASK_DIALOG_ACTION_CONTAINER\n }, task.type ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n size: \"large\",\n variant: \"contained\",\n color: \"primary\",\n onClick: () => handleTaskDetailOpen(task.rn, task.type)\n }, task[\"detail_list\"]) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n color: \"textSecondary\"\n }, `Анализ отклонений недоступен: ${task[\"detail_list\"]}`))));\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 selectedTaskDetail: null,\n selectedTaskDetailType: null\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 selectedTaskDetail: null,\n selectedTaskDetailType: null\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 selectedTaskDetail: null,\n selectedTaskDetailType: null\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 const handleTaskDetailClose = () => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n };\n\n //При открытии окна детализации\n const handleTaskDetailOpen = (taskRn, taskType) => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: taskRn,\n selectedTaskDetailType: taskType\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"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_29__[\"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_30__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"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_26__[\"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_26__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"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_31__[\"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_32__[\"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_33__[\"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_33__[\"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_26__[\"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_31__[\"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_32__[\"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_33__[\"default\"], {\n value: el,\n key: el\n }, el))))) : 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 taskDialogRenderer: prms => taskDialogRenderer({\n ...prms,\n handleTaskDetailOpen\n })\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null, state.selectedTaskDetail ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {\n open: true,\n onClose: handleTaskDetailClose,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], null, [0, 1, 4].includes(state.selectedTaskDetailType) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_7__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_8__.IncomFromDepsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }), state.selectedTaskDetailType === 3 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n sx: STYLES.SECOND_TABLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_7__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n onClick: handleTaskDetailClose\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : 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_17__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_17__);\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/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.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/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardHeader/CardHeader.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.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\");\n/* harmony import */ var _datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./datagrids/fcroutlst */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\");\n/* harmony import */ var _datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./datagrids/incomefromdeps */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.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\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 SECOND_TABLE: {\n paddingTop: \"30px\"\n },\n TASK_DIALOG_CARD_CONTAINER: {\n padding: \"0px\"\n },\n TASK_DIALOG_LIST_ITEM_ICON: {\n justifyContent: \"center\"\n },\n TASK_DIALOG_ICON: {\n fontSize: \"2rem\"\n },\n TASK_DIALOG_ACTION_CONTAINER: {\n border: 1,\n borderColor: \"text.primary\",\n borderRadius: \"5px\",\n width: \"100%\"\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) => [\"numb\", \"title\"].includes(name) ? 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) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\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_9__[\"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_10__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\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_13__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"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_15__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"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_16__[\"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_17___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().func)\n};\n\n//Генерация диалога задачи\nconst taskDialogRenderer = ({\n task,\n taskColors,\n close,\n handleTaskDetailOpen\n}) => {\n //Стиль и описание для легенды\n const legendDesc = (0,_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_4__.taskLegendDesc)({\n task,\n taskColors\n });\n //Элемент карточки задачи\n const cardItem = ({\n listItemsStyle = {},\n icon,\n primaryText = null,\n secondaryText = null\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n disablePadding: true,\n sx: listItemsStyle\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n sx: STYLES.TASK_DIALOG_LIST_ITEM_ICON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n sx: STYLES.TASK_DIALOG_ICON\n }, icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n primary: primaryText,\n secondary: secondaryText\n })));\n //Собираем содержимое диалога\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n title: task.name,\n titleTypographyProps: {\n variant: \"h6\"\n },\n subheader: `${(0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateRF)(task.start)} - ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_5__.formatDateRF)(task.end)}`,\n action: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n \"aria-label\": \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\",\n onClick: close\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"close\"))\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n sx: STYLES.TASK_DIALOG_CARD_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, cardItem({\n icon: \"fast_forward\",\n primaryText: `${task.start_fact} ${task.meas}`,\n secondaryText: \"Запущено\"\n }), cardItem({\n icon: \"assessment\",\n primaryText: `${task.main_quant} ${task.meas}`,\n secondaryText: \"Количество план\"\n }), cardItem({\n icon: \"verified\",\n primaryText: `${task.rel_fact} ${task.meas}`,\n secondaryText: \"Количество сдано\"\n }), cardItem({\n icon: \"date_range\",\n primaryText: task.rep_date_to,\n secondaryText: \"Дата выпуска план\"\n }), legendDesc ? cardItem({\n listItemsStyle: legendDesc.style,\n icon: \"palette\",\n secondaryText: legendDesc.text\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n disableSpacing: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n p: 2,\n display: \"flex\",\n justifyContent: \"center\",\n sx: STYLES.TASK_DIALOG_ACTION_CONTAINER\n }, task.type ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n size: \"large\",\n variant: \"contained\",\n color: \"primary\",\n onClick: () => handleTaskDetailOpen(task.rn, task.type)\n }, task[\"detail_list\"]) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n color: \"textSecondary\"\n }, `Анализ отклонений недоступен: ${task[\"detail_list\"]}`))));\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 selectedTaskDetail: null,\n selectedTaskDetailType: null\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.FCPRODPLAN_PP_CTLG_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 selectedTaskDetail: null,\n selectedTaskDetailType: null\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 selectedTaskDetail: null,\n selectedTaskDetailType: null\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 const handleTaskDetailClose = () => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n };\n\n //При открытии окна детализации\n const handleTaskDetailOpen = (taskRn, taskType) => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: taskRn,\n selectedTaskDetailType: taskType\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"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_29__[\"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_30__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"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_26__[\"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_26__[\"default\"], {\n sx: {\n display: \"table\",\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"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_31__[\"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_32__[\"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_33__[\"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_33__[\"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_26__[\"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_31__[\"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_32__[\"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_33__[\"default\"], {\n value: el,\n key: el\n }, el))))) : 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 taskDialogRenderer: prms => taskDialogRenderer({\n ...prms,\n handleTaskDetailOpen\n })\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите каталог планов для отображения их спецификаций\"\n }) : null)) : null, state.selectedTaskDetail ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {\n open: true,\n onClose: handleTaskDetailClose,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], null, [0, 1, 4].includes(state.selectedTaskDetailType) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_7__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_8__.IncomFromDepsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }), state.selectedTaskDetailType === 3 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n sx: STYLES.SECOND_TABLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_7__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n onClick: handleTaskDetailClose\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : 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/mech_rec_dept_cost_jobs/index.js":
+/*!*****************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_jobs/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 _mech_rec_dept_cost_jobs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mech_rec_dept_cost_jobs */ \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Загрузка цеха\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель загрузки цеха\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _mech_rec_dept_cost_jobs__WEBPACK_IMPORTED_MODULE_0__.MechRecDeptCostJobs;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_jobs/index.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js":
+/*!***********************************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.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 */ MechRecDeptCostJobs: () => (/* binding */ MechRecDeptCostJobs)\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_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/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 Панель мониторинга: Корневая панель загрузки цеха\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\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 DATA_GRID_CONTAINER: {\n minWidth: \"95vw\",\n maxWidth: \"95vw\",\n minHeight: \"80vh\",\n maxHeight: \"80vh\"\n },\n DATA_GRID_CELL: (row, columnDef) => ({\n padding: \"8px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\",\n ...(columnDef.name.match(/N.*_VALUE/) && row[columnDef.name] ? {\n backgroundColor: row[`${columnDef.name.substring(0, 12)}_TYPE`] === 0 ? \"lightgrey\" : \"lightgreen\"\n } : {})\n })\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef\n}) => ({\n cellProps: {\n title: row[columnDef.name]\n },\n cellStyle: STYLES.DATA_GRID_CELL(row, columnDef),\n data: row[columnDef]\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель загрузки цеха\nconst MechRecDeptCostJobs = () => {\n //Собственное состояние - таблица данных\n const [costJobs, setCostJobs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n subdiv: null,\n dataLoaded: false,\n columnsDef: [],\n filters: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0\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 (costJobs.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBS_DEP_LOAD_DG_GET\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(costJobs.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)(costJobs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costJobs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costJobs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostJobs(pv => ({\n ...pv,\n fixedHeader: data.XFCJOBS.XDATA.XDATA_GRID.fixedHeader,\n fixedColumns: data.XFCJOBS.XDATA.XDATA_GRID.fixedColumns,\n subdiv: data.XINFO.SSUBDIV,\n columnsDef: data.XFCJOBS.XDATA.XCOLUMNS_DEF ? [...data.XFCJOBS.XDATA.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XFCJOBS.XDATA.XROWS || [])] : [...pv.rows, ...(data.XFCJOBS.XDATA.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XFCJOBS.XDATA.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [costJobs.reload, costJobs.filters, costJobs.orders, costJobs.dataLoaded, costJobs.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setCostJobs(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setCostJobs(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setCostJobs(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 }, [costJobs.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_5__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, costJobs.dataLoaded ? `Загрузка станков \"${costJobs.subdiv}\"` : 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 pt: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, costJobs.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 containerComponentProps: {\n elevation: 6,\n style: STYLES.DATA_GRID_CONTAINER\n },\n fixedHeader: costJobs.fixedHeader,\n fixedColumns: costJobs.fixedColumns,\n columnsDef: costJobs.columnsDef,\n rows: costJobs.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n morePages: costJobs.morePages,\n reloading: costJobs.reload,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms\n })\n })) : null))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js":
+/*!***************************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.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 */ CostRouteListsDataGridDialog: () => (/* binding */ CostRouteListsDataGridDialog),\n/* harmony export */ rowExpandRender: () => (/* binding */ rowExpandRender)\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_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.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/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _fcroutlstsp__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fcroutlstsp */ \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.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//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\"\n },\n TABLE: {\n paddingTop: \"15px\"\n },\n TABLE_SUM: {\n textAlign: \"right\",\n paddingTop: \"5px\",\n paddingRight: \"15px\"\n },\n DIALOG_BUTTONS: {\n marginTop: \"10px\",\n width: \"240px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Генерация представления расширения строки\nconst rowExpandRender = ({\n row\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n elevation: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcroutlstsp__WEBPACK_IMPORTED_MODULE_5__.CostRouteListsSpecsDataGrid, {\n mainRowRN: row.NRN\n }));\n};\n\n//Форматирование значений колонок\nconst dataCellRender = ({\n row,\n columnDef,\n handlePriorEditOpen\n}) => {\n //!!! Пока отключено - не удалять\n switch (columnDef.name) {\n case \"NPRIOR_PARTY\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, row[\"NPRIOR_PARTY\"], /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n edge: \"end\",\n title: \"\\u0418\\u0437\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C \\u043F\\u0440\\u0438\\u043E\\u0440\\u0438\\u0442\\u0435\\u0442\",\n onClick: () => handlePriorEditOpen(row[\"NRN\"], row[\"NPRIOR_PARTY\"])\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, \"edit\")))\n };\n }\n return {\n data: row[columnDef]\n };\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица маршрутных листов\nconst CostRouteListsDataGrid = ({\n task\n}) => {\n //Собственное состояние - таблица данных\n const [costRouteLists, setCostRouteLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n editPriorNRN: null,\n editPriorValue: null\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_3__[\"BackEndСtx\"]);\n\n //Размер страницы данных\n const DATA_GRID_PAGE_SIZE = 5;\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costRouteLists.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DEPT_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(costRouteLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteLists(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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costRouteLists.reload, costRouteLists.filters, costRouteLists.orders, costRouteLists.dataLoaded, costRouteLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costRouteLists.reload, loadData]);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setCostRouteLists(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setCostRouteLists(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При открытии изменения приоритета партии\n const handlePriorEditOpen = (NRN, nPriorValue) => {\n setCostRouteLists(pv => ({\n ...pv,\n editPriorNRN: NRN,\n editPriorValue: nPriorValue\n }));\n };\n\n //При закрытии изменения приоритета партии\n const handlePriorEditClose = () => {\n setCostRouteLists(pv => ({\n ...pv,\n editPriorNRN: null,\n editPriorValue: null\n }));\n };\n\n //При изменении значения приоритета партии\n const handlePriorFormChanged = e => {\n setCostRouteLists(pv => ({\n ...pv,\n editPriorValue: e.target.value\n }));\n };\n\n //Изменение приоритета\n const priorChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (NRN, PriorValue, rows) => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_PRIOR_PARTY_UPDATE\",\n args: {\n NFCROUTLST: NRN,\n SPRIOR_PARTY: PriorValue\n }\n });\n //Изменяем значение приоритета у нужного\n rows[rows.findIndex(obj => obj.NRN == NRN)].NPRIOR_PARTY = PriorValue;\n //Актуализируем строки таблицы\n setCostRouteLists(pv => ({\n ...pv,\n rows: rows\n }));\n //Закрываем окно\n handlePriorEditClose();\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При нажатии на изменение приоритета партии\n const handlePriorChange = () => {\n //Изменяем значение\n priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue, costRouteLists.rows);\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_9__[\"default\"], {\n variant: \"h6\"\n }, \"\\u0412 \\u043F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0441\\u0442\\u0432\\u0435\"), costRouteLists.dataLoaded ? /*#__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_10__[\"default\"], {\n sx: STYLES.TABLE\n }, /*#__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: costRouteLists.columnsDef,\n rows: costRouteLists.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n morePages: costRouteLists.morePages,\n reloading: costRouteLists.reload,\n expandable: true,\n rowExpandRender: rowExpandRender,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handlePriorEditOpen\n })\n })))) : null, costRouteLists.editPriorNRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n open: true,\n onClose: () => handlePriorEditClose(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_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n name: \"editPriorValue\",\n label: \"\\u041D\\u043E\\u0432\\u043E\\u0435 \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u043F\\u0440\\u0438\\u043E\\u0440\\u0438\\u0442\\u0435\\u0442\\u0430\",\n variant: \"standard\",\n fullWidth: true,\n type: \"number\",\n value: costRouteLists.editPriorValue,\n onChange: handlePriorFormChanged\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_14__[\"default\"], {\n onClick: handlePriorChange,\n variant: \"contained\",\n sx: STYLES.DIALOG_BUTTONS\n }, \"\\u0418\\u0437\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C\")))), /*#__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_14__[\"default\"], {\n onClick: () => handlePriorEditClose(null)\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : null);\n};\n\n//Контроль свойств - Таблица маршрутных листов\nCostRouteListsDataGrid.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number).isRequired\n};\n\n//Диалог с таблицей сдачи продукции\nconst CostRouteListsDataGridDialog = ({\n task,\n onClose\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n open: true,\n onClose: onClose ? onClose : null,\n fullWidth: true,\n maxWidth: \"xl\"\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(CostRouteListsDataGrid, {\n task: task\n })), onClose ? /*#__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_14__[\"default\"], {\n onClick: onClose\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\")) : null);\n};\n\n//Контроль свойств - Диалог с таблицей маршрутных листов\nCostRouteListsDataGridDialog.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js":
+/*!*****************************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.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 */ CostRouteListsSpecsDataGrid: () => (/* binding */ CostRouteListsSpecsDataGrid)\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__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.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 STYLES = {\n CONTAINER: {\n margin: \"5px 0px\",\n textAlign: \"center\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица строк маршрутного листа\nconst CostRouteListsSpecsDataGrid = ({\n mainRowRN\n}) => {\n //Собственное состояние - таблица данных\n const [costRouteListsSpecs, setCostRouteListsSpecs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\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_3__[\"BackEndСtx\"]);\n\n //Размер страницы данных\n const DATA_GRID_PAGE_SIZE = 10;\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costRouteListsSpecs.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLSTSP_DEPT_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(costRouteListsSpecs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteListsSpecs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costRouteListsSpecs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteListsSpecs(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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costRouteListsSpecs.reload, costRouteListsSpecs.filters, costRouteListsSpecs.orders, costRouteListsSpecs.dataLoaded, costRouteListsSpecs.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costRouteListsSpecs.reload, loadData]);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setCostRouteListsSpecs(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setCostRouteListsSpecs(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: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n variant: \"subtitle2\"\n }, \"\\u041E\\u043F\\u0435\\u0440\\u0430\\u0446\\u0438\\u0438\"), costRouteListsSpecs.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: costRouteListsSpecs.columnsDef,\n rows: costRouteListsSpecs.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: costRouteListsSpecs.morePages,\n reloading: costRouteListsSpecs.reload,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Таблица строк маршрутного листа\nCostRouteListsSpecsDataGrid.propTypes = {\n mainRowRN: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_prod_plans/hooks.js":
+/*!***********************************************************!*\
+ !*** ./app/panels/mech_rec_dept_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 */ 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(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.planName));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/hooks.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js":
+/*!********************************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.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 */ IncomFromDepsDataGridDialog: () => (/* binding */ IncomFromDepsDataGridDialog)\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__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/Box/Box.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/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.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 STYLES = {\n CONTAINER: {\n textAlign: \"center\"\n },\n TABLE: {\n paddingTop: \"15px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица сдачи продукции\nconst IncomFromDepsDataGrid = ({\n task\n}) => {\n //Собственное состояние - таблица данных\n const [incomFromDeps, setIncomFromDeps] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Размер страницы данных\n const DATA_GRID_PAGE_SIZE = 10;\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (incomFromDeps.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DEPT_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(incomFromDeps.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: incomFromDeps.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DDUE_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setIncomFromDeps(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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [incomFromDeps.reload, incomFromDeps.orders, incomFromDeps.dataLoaded, incomFromDeps.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [incomFromDeps.reload, loadData]);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setIncomFromDeps(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setIncomFromDeps(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: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n variant: \"h6\"\n }, \"\\u0421\\u0434\\u0430\\u0447\\u0430 \\u043F\\u0440\\u043E\\u0434\\u0443\\u043A\\u0446\\u0438\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TABLE\n }, incomFromDeps.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: incomFromDeps.columnsDef,\n rows: incomFromDeps.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n morePages: incomFromDeps.morePages,\n reloading: incomFromDeps.reload,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null));\n};\n\n//Контроль свойств - Таблица сдачи продукции\nIncomFromDepsDataGrid.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().number).isRequired\n};\n\n//Диалог с таблицей сдачи продукции\nconst IncomFromDepsDataGridDialog = ({\n task,\n onClose\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onClose ? onClose : null,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(IncomFromDepsDataGrid, {\n task: task\n })), onClose ? /*#__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: onClose\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\")) : null);\n};\n\n//Контроль свойств - Диалог с таблицей сдачи продукции\nIncomFromDepsDataGridDialog.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().number).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_prod_plans/index.js":
+/*!***********************************************************!*\
+ !*** ./app/panels/mech_rec_dept_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 _mech_rec_dept_cost_prod_plans__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mech_rec_dept_cost_prod_plans */ \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_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_dept_cost_prod_plans__WEBPACK_IMPORTED_MODULE_0__.MechRecDeptCostProdPlans;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/index.js?");
+
+/***/ }),
+
+/***/ "./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js":
+/*!***********************************************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_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 */ MechRecDeptCostProdPlans: () => (/* binding */ MechRecDeptCostProdPlans),\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_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\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 _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.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 _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _incomefromdeps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./incomefromdeps */ \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\");\n/* harmony import */ var _fcroutlst__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fcroutlst */ \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.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\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 marginTop: \"10px\",\n marginLeft: \"10px\"\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 CONTAINER: {\n paddingTop: \"40px\",\n margin: \"5px 0px\",\n textAlign: \"center\"\n },\n DATA_GRID_CONTAINER: {\n minWidth: \"95vw\",\n maxWidth: \"95vw\",\n minHeight: \"80vh\",\n maxHeight: \"80vh\"\n },\n DATA_GRID_GROUP_CELL: {\n padding: \"2px\"\n },\n DATA_GRID_CELL: {\n padding: \"8px\",\n maxWidth: \"300px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\"\n },\n DATA_GRID_CELL_STATUS: (currentStyle, row) => ({\n backgroundColor: getRowBackgroudColor(row),\n ...currentStyle\n }),\n DATA_GRID_CELL_PLAN_FACT: currentStyle => ({\n ...currentStyle,\n backgroundColor: \"lightgrey\"\n }),\n DATA_GRID_CELL_MATRES_CODE: (currentStyle, row) => ({\n backgroundColor: getRowBackgroudColor(row),\n ...currentStyle\n }),\n PLAN_FACT_VALUE: {\n textAlign: \"center\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n PLAN_FACT_DELIMITER: {\n padding: \"0px 5px\"\n },\n FACT_VALUE: {\n color: \"blue\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = ({\n group\n}) => ({\n cellStyle: STYLES.DATA_GRID_GROUP_CELL,\n data: group.caption\n});\n\n//Вычисление цвета заливки для строки\nconst getRowBackgroudColor = row => {\n //Факт === План\n if (row[\"NMAIN_QUANT\"] === row[\"NREL_FACT\"]) return \"lightgreen\";\n //План <= (Факт + Запущено)\n if (row[\"NMAIN_QUANT\"] <= row[\"NREL_FACT\"] + row[\"NFCROUTLST_QUANT\"]) return \"lightblue\";\n //Сумма \"Количество план\" = 0 или < \"План\"\n if (row[\"NSUM_PLAN\"] === 0 || row[\"NSUM_PLAN\"] !== 0 && row[\"NSUM_PLAN\"] < row[\"NMAIN_QUANT\"]) {\n //\"Факт\" >= \"План\"\n if (row[\"NREL_FACT\"] >= row[\"NMAIN_QUANT\"]) return \"#F0E68C\";\n } else {\n //Сумма \"Количество факт\" >= сумма \"Количество план\"\n if (row[\"NSUM_FACT\"] >= row[\"NSUM_PLAN\"]) return \"#F0E68C\";\n }\n return \"lightcoral\";\n};\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef,\n handleProdOrderClick,\n handleMatresCodeClick\n}) => {\n //Описываем общие свойства\n let cellProps = {\n title: row[columnDef.name]\n };\n //Описываем общий стиль\n let cellStyle = STYLES.DATA_GRID_CELL;\n //Для колонки \"Статус\"\n if (columnDef.name === \"SSTATUS\") return {\n cellProps,\n cellStyle: STYLES.DATA_GRID_CELL_STATUS(cellStyle, row),\n data: row[columnDef]\n };\n //Для колонки даты\n if (columnDef.name.indexOf(\"PLAN_FACT\") >= 0) {\n //Получаем текущий день\n let curDay = new Date().getDate().toString().padStart(2, \"0\");\n //Формируем regex для проверки\n let regex = new RegExp(`N_${curDay}.*`, \"g\");\n //Если это значение текущего дня\n if (columnDef.name.match(regex)) cellStyle = STYLES.DATA_GRID_CELL_PLAN_FACT(cellStyle);\n //Если в колонке есть значение\n if (row[columnDef.name]) {\n //Разбиваем его на план/факт\n let values = row[columnDef.name].split(\"/\");\n //Разбиваем значения на блоки\n return {\n cellProps,\n cellStyle,\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLAN_FACT_VALUE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, values[0]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLAN_FACT_DELIMITER\n }, \"/\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.FACT_VALUE\n }, values[1]))\n };\n } else return {\n cellProps,\n cellStyle,\n data: row[columnDef]\n };\n }\n //Для колонки \"Заказ\"\n if (columnDef.name === \"SPROD_ORDER\") {\n return {\n cellProps,\n cellStyle,\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => handleProdOrderClick(row[\"NRN\"])\n }, row[columnDef.name])\n };\n }\n //Для колонки \"Обозначение\"\n if (columnDef.name === \"SMATRES_CODE\") return {\n cellProps,\n cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => handleMatresCodeClick(row[\"NRN\"])\n }, row[columnDef.name])\n };\n //Для всех остальных\n return {\n cellProps,\n cellStyle,\n data: row[columnDef]\n };\n};\n\n//Список каталогов планов\nconst PlanList = ({\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_11__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter.planName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n planName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan.NRN,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственного плана цеха\nconst MechRecDeptCostProdPlans = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n planList: [],\n planListLoaded: false,\n selectedPlan: {},\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0\n });\n\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n planName: \"\"\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_2__.useFilteredPlans)(state.planList, filter);\n\n //Размер страницы данных\n const DATA_GRID_PAGE_SIZE = 10;\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 {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingС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.FCPRODPLAN_DEPT_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\",\n attributeValueProcessor: (name, val) => name === \"SPERIOD\" ? undefined : val\n });\n setState(pv => ({\n ...pv,\n init: true,\n planList: [...(data?.XFCPRODPLANS || [])],\n planListLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NRN => {\n if (state.reload && NRN) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_DEPT_DG_GET\",\n args: {\n NFCPRODPLAN: NRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(state.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: state.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: state.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => name === \"caption\" ? undefined : val\n });\n setState(pv => ({\n ...pv,\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\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 [state.reload, state.orders, state.dataLoaded, state.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan.NRN) {\n loadData(state.selectedPlan.NRN);\n } else {\n setState(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n }\n }, [state.selectedPlan, state.reload, loadData]);\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 const selectPlan = plan => {\n setState(pv => ({\n ...pv,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n selectedPlan: plan,\n showPlanList: false,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n selectedPlan: {},\n showPlanList: false,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n\n //Обработка нажатия на элемент в списке планов\n const handlePlanClick = plan => {\n if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan);else unselectPlan();\n };\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setState(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setState(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на \"Заказ\"\n const handleProdOrderClick = planSp => {\n setState(pv => ({\n ...pv,\n showIncomeFromDeps: planSp\n }));\n };\n\n //При нажатии на \"Обозначение\"\n const handleMatresCodeClick = planSp => {\n setState(pv => ({\n ...pv,\n showFcroutelst: planSp\n }));\n };\n\n //Генерация содержимого\n return /*#__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_17__[\"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_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(PlanList, {\n plans: filteredPlanCtgls,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handlePlanClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, state.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"h6\"\n }, `Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`) : null, /*#__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 }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, state.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n style: STYLES.DATA_GRID_CONTAINER\n },\n fixedHeader: state.fixedHeader,\n fixedColumns: state.fixedColumns,\n columnsDef: state.columnsDef,\n rows: state.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: state.morePages,\n reloading: state.reload,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handleProdOrderClick,\n handleMatresCodeClick\n }),\n groupCellRender: groupCellRender\n })) : !state.selectedPlan.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификаций\"\n }) : null))), state.showIncomeFromDeps ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_incomefromdeps__WEBPACK_IMPORTED_MODULE_7__.IncomFromDepsDataGridDialog, {\n task: state.showIncomeFromDeps,\n onClose: () => handleProdOrderClick(null)\n }) : null, state.showFcroutelst ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcroutlst__WEBPACK_IMPORTED_MODULE_8__.CostRouteListsDataGridDialog, {\n task: state.showFcroutelst,\n onClose: () => handleMatresCodeClick(null)\n }) : null));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js?");
/***/ }),
@@ -3656,7 +4272,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 */ Projects: () => (/* binding */ Projects)\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_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.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/Icon/Icon.js\");\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_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\n/* harmony import */ var _stages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stages */ \"./app/panels/prj_fin/stages.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//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CHART: {\n maxHeight: \"300px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n height: \"100%\"\n },\n CHART_FAB: {\n position: \"absolute\",\n top: 80,\n left: 16\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список проектов\nconst Projects = () => {\n //Собственное состояние\n const [projectsDataGrid, setProjectsDataGrid] = (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 selectedProject: null,\n stagesFilters: []\n });\n\n //Состояния графиков\n const [showCharts, setShowCharts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [problemsChart, setProblemsChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [customersChart, setCustomersChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [costNotesChart, setCostNotesChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\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_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных проектов с сервера\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (projectsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.LIST\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.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)(projectsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: projectsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setProjectsDataGrid(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 >= configSystemPageSize\n }));\n }\n }, [projectsDataGrid.reload, projectsDataGrid.filters, projectsDataGrid.orders, projectsDataGrid.dataLoaded, projectsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Получение данных графиков\n const loadChartData = async () => {\n const problemsChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_PROBLEMS\",\n respArg: \"COUT\"\n });\n setProblemsChart(pv => ({\n ...pv,\n loaded: true,\n ...problemsChart.XCHART\n }));\n const customersChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_CUSTOMERS\",\n respArg: \"COUT\"\n });\n setCustomersChart(pv => ({\n ...pv,\n loaded: true,\n ...customersChart.XCHART\n }));\n const costNotesChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES\",\n respArg: \"COUT\"\n });\n setCostNotesChart(pv => ({\n ...pv,\n loaded: true,\n ...costNotesChart.XCHART\n }));\n };\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение детализации точки графика затрат\n const showCostNotesChartDetail = async ({\n unitCode,\n year,\n month\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST\",\n args: {\n NYEAR: year,\n NMONTH: month\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode,\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение этапов проекта\n const showStages = ({\n sender,\n filters = []\n } = {}) => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: {\n ...sender\n },\n stagesFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setProjectsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка этапов проекта\n const handleStagesClose = () => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: null,\n stagesFilters: []\n }));\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n if (item.SFILTER && item.SFILTER_VALUE) setProjectsDataGrid(pv => ({\n ...pv,\n filters: [{\n name: item.SFILTER,\n from: item.SFILTER_VALUE\n }],\n pageNumber: 1,\n reload: true\n }));\n if (item.SUNITCODE && item.NYEAR && item.NMONTH) showCostNotesChartDetail({\n unitCode: item.SUNITCODE,\n year: item.NYEAR,\n month: item.NMONTH\n });\n };\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadProjects();\n }, [projectsDataGrid.reload, loadProjects]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChartData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n spacing: 1\n }, showCharts ? /*#__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 item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, problemsChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, problemsChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, customersChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, customersChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, costNotesChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 12\n }, projectsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: projectsDataGrid.columnsDef,\n rows: projectsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n filtersInitial: projectsDataGrid.filters,\n morePages: projectsDataGrid.morePages,\n reloading: projectsDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_10__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n showStages\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n pOnlineShowDocument,\n showPayNotes,\n showStages\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, projectsDataGrid.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Этапы проекта \"${projectsDataGrid.selectedProject.SNAME_USL}\"`,\n onClose: handleStagesClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stages__WEBPACK_IMPORTED_MODULE_11__.Stages, {\n project: projectsDataGrid.selectedProject.NRN,\n projectName: projectsDataGrid.selectedProject.SNAME_USL,\n filters: projectsDataGrid.stagesFilters\n })) : null)), problemsChart.loaded || customersChart.loaded || costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n size: \"small\",\n color: \"secondary\",\n sx: STYLES.CHART_FAB,\n onClick: () => setShowCharts(!showCharts)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, showCharts ? \"expand_less\" : \"expand_more\")) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/projects.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projects: () => (/* binding */ Projects)\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_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.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/Icon/Icon.js\");\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_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\n/* harmony import */ var _stages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stages */ \"./app/panels/prj_fin/stages.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//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CHART: {\n maxHeight: \"300px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n height: \"100%\"\n },\n CHART_FAB: {\n position: \"absolute\",\n top: 80,\n left: 16\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список проектов\nconst Projects = () => {\n //Собственное состояние\n const [projectsDataGrid, setProjectsDataGrid] = (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 selectedProject: null,\n stagesFilters: []\n });\n\n //Состояния графиков\n const [showCharts, setShowCharts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [problemsChart, setProblemsChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [customersChart, setCustomersChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [costNotesChart, setCostNotesChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\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_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных проектов с сервера\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (projectsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.LIST\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.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)(projectsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: projectsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setProjectsDataGrid(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 >= configSystemPageSize\n }));\n }\n }, [projectsDataGrid.reload, projectsDataGrid.filters, projectsDataGrid.orders, projectsDataGrid.dataLoaded, projectsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Получение данных графиков\n const loadChartData = async () => {\n const problemsChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_PROBLEMS\",\n respArg: \"COUT\"\n });\n setProblemsChart(pv => ({\n ...pv,\n loaded: true,\n ...problemsChart.XCHART\n }));\n const customersChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_CUSTOMERS\",\n respArg: \"COUT\"\n });\n setCustomersChart(pv => ({\n ...pv,\n loaded: true,\n ...customersChart.XCHART\n }));\n const costNotesChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES\",\n respArg: \"COUT\"\n });\n setCostNotesChart(pv => ({\n ...pv,\n loaded: true,\n ...costNotesChart.XCHART\n }));\n };\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение детализации точки графика затрат\n const showCostNotesChartDetail = async ({\n year,\n month\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST\",\n args: {\n NYEAR: year,\n NMONTH: month\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение этапов проекта\n const showStages = ({\n sender,\n filters = []\n } = {}) => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: {\n ...sender\n },\n stagesFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setProjectsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка этапов проекта\n const handleStagesClose = () => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: null,\n stagesFilters: []\n }));\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n if (item.SFILTER && item.SFILTER_VALUE) setProjectsDataGrid(pv => ({\n ...pv,\n filters: [{\n name: item.SFILTER,\n from: item.SFILTER_VALUE\n }],\n pageNumber: 1,\n reload: true\n }));\n if (item.SUNITCODE == \"CostNotes\" && item.NYEAR && item.NMONTH) showCostNotesChartDetail({\n year: item.NYEAR,\n month: item.NMONTH\n });\n };\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadProjects();\n }, [projectsDataGrid.reload, loadProjects]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChartData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n spacing: 1\n }, showCharts ? /*#__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 item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, problemsChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, problemsChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, customersChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, customersChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, costNotesChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 12\n }, projectsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: projectsDataGrid.columnsDef,\n rows: projectsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n filtersInitial: projectsDataGrid.filters,\n morePages: projectsDataGrid.morePages,\n reloading: projectsDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_10__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n showStages\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n pOnlineShowDocument,\n showPayNotes,\n showStages\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, projectsDataGrid.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Этапы проекта \"${projectsDataGrid.selectedProject.SNAME_USL}\"`,\n onClose: handleStagesClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stages__WEBPACK_IMPORTED_MODULE_11__.Stages, {\n project: projectsDataGrid.selectedProject.NRN,\n projectName: projectsDataGrid.selectedProject.SNAME_USL,\n filters: projectsDataGrid.stagesFilters\n })) : null)), problemsChart.loaded || customersChart.loaded || costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n size: \"small\",\n color: \"secondary\",\n sx: STYLES.CHART_FAB,\n onClick: () => setShowCharts(!showCharts)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, showCharts ? \"expand_less\" : \"expand_more\")) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/projects.js?");
/***/ }),
@@ -3667,7 +4283,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 */ StageArts: () => (/* binding */ StageArts)\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_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 _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/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//-----------\n//Тело модуля\n//-----------\n\n//Калькуляция этапа проекта\nconst StageArts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageArtsDataGrid, setStageArtsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n rows: [],\n reload: 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 {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных калькуляции этапа с сервера\n const loadStageArts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageArtsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageArtsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: stageArtsDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStageArtsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [stage, stageArtsDataGrid.reload, stageArtsDataGrid.filters, stageArtsDataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала затрат по статье калькуляции\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение договоров по статье калькуляции\n const showContracts = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_CONTR\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageArtsDataGrid(pv => ({\n ...pv,\n filters,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageArts();\n }, [stageArtsDataGrid.reload, loadStageArts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageArtsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageArtsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageArtsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: false,\n reloading: stageArtsDataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_ARTS,\n showCostNotes,\n showContracts\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onFilterChanged: handleFilterChanged\n })) : null);\n};\n\n//Контроль свойств - Калькуляция этапа проекта\nStageArts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_arts.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageArts: () => (/* binding */ StageArts)\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_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 _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/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//-----------\n//Тело модуля\n//-----------\n\n//Калькуляция этапа проекта\nconst StageArts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageArtsDataGrid, setStageArtsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n rows: [],\n reload: 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 {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных калькуляции этапа с сервера\n const loadStageArts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageArtsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageArtsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: stageArtsDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStageArtsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [stage, stageArtsDataGrid.reload, stageArtsDataGrid.filters, stageArtsDataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала затрат по статье калькуляции\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение договоров по статье калькуляции\n const showContracts = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_CONTR\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageArtsDataGrid(pv => ({\n ...pv,\n filters,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageArts();\n }, [stageArtsDataGrid.reload, loadStageArts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageArtsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageArtsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageArtsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: false,\n reloading: stageArtsDataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_ARTS,\n showCostNotes,\n showContracts\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onFilterChanged: handleFilterChanged\n })) : null);\n};\n\n//Контроль свойств - Калькуляция этапа проекта\nStageArts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_arts.js?");
/***/ }),
@@ -3678,7 +4294,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 */ StageContracts: () => (/* binding */ StageContracts)\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_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 _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/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//-----------\n//Тело модуля\n//-----------\n\n//Договоры с соисполнителями этапа проекта\nconst StageContracts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageContractsDataGrid, setStageContractsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\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 {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStageContracts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageContractsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.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)(stageContractsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stageContractsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setStageContractsDataGrid(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 >= configSystemPageSize\n }));\n }\n }, [stage, stageContractsDataGrid.reload, stageContractsDataGrid.filters, stageContractsDataGrid.orders, stageContractsDataGrid.dataLoaded, stageContractsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение выходящих счетов на оплату от соисполнителя этапа\n const showPaymentAccountsIn = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PaymentAccountsIn\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение фактических платежей соисполнителю этапа\n const showPayNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение приходных накладных от соисполнителя этапа\n const showIncomingInvoices = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"IncomingInvoices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStageContractsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageContracts();\n }, [stageContractsDataGrid.reload, loadStageContracts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageContractsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageContractsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageContractsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stageContractsDataGrid.morePages,\n reloading: stageContractsDataGrid.reload,\n expandable: true,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument,\n showPaymentAccountsIn,\n showPayNotes,\n showIncomingInvoices\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Договоры с соисполнителями этапа проекта\nStageContracts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_contracts.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageContracts: () => (/* binding */ StageContracts)\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_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 _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/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//-----------\n//Тело модуля\n//-----------\n\n//Договоры с соисполнителями этапа проекта\nconst StageContracts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageContractsDataGrid, setStageContractsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\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 {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStageContracts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageContractsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.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)(stageContractsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stageContractsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setStageContractsDataGrid(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 >= configSystemPageSize\n }));\n }\n }, [stage, stageContractsDataGrid.reload, stageContractsDataGrid.filters, stageContractsDataGrid.orders, stageContractsDataGrid.dataLoaded, stageContractsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение выходящих счетов на оплату от соисполнителя этапа\n const showPaymentAccountsIn = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PaymentAccountsIn\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение фактических платежей соисполнителю этапа\n const showPayNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение приходных накладных от соисполнителя этапа\n const showIncomingInvoices = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"IncomingInvoices\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStageContractsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageContracts();\n }, [stageContractsDataGrid.reload, loadStageContracts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageContractsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageContractsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageContractsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stageContractsDataGrid.morePages,\n reloading: stageContractsDataGrid.reload,\n expandable: true,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument,\n showPaymentAccountsIn,\n showPayNotes,\n showIncomingInvoices\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Договоры с соисполнителями этапа проекта\nStageContracts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_contracts.js?");
/***/ }),
@@ -3689,7 +4305,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 */ Stages: () => (/* binding */ Stages)\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_12__ = __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 _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _stage_arts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stage_arts */ \"./app/panels/prj_fin/stage_arts.js\");\n/* harmony import */ var _stage_contracts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stage_contracts */ \"./app/panels/prj_fin/stage_contracts.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/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 //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список этапов проекта\nconst Stages = ({\n project,\n projectName,\n filters\n}) => {\n //Собственное состояние\n const [stagesDataGrid, setStagesDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedStageNumb: null,\n showStageArts: null,\n stageArtsFilters: [],\n showStageContracts: null,\n stageContractsFilters: []\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_7__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_8__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_9__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStages = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stagesDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_LIST\",\n args: {\n NPRN: project,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.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)(stagesDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stagesDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStagesDataGrid(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 >= configSystemPageSize\n }));\n }\n }, [project, stagesDataGrid.reload, stagesDataGrid.filters, stagesDataGrid.orders, stagesDataGrid.dataLoaded, stagesDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение журнала затрат по этапу проекта\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение расходных накладных на отпуск потребителям по этапу проекта\n const showGoodsTransInvoicesToConsumers = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"GoodsTransInvoicesToConsumers\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение статей калькуляции по этапу проекта\n const showStageArts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageArtsFilters: [...filters]\n }));\n\n //Отображение договоров с соисполнителями по этапу проекта\n const showContracts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageContractsFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStagesDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStagesDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStagesDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка договоров этапа\n const handleStageContractsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: null,\n stageContractsFilters: []\n }));\n\n //При закрытии калькуляции этапа\n const handleStageArtsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: null,\n stageArtsFilters: []\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStages();\n }, [stagesDataGrid.reload, loadStages]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n pt: 2\n }, stagesDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_10__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stagesDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stagesDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stagesDataGrid.morePages,\n reloading: stagesDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_11__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n showStageArts,\n showContracts\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n pOnlineShowDocument,\n showStageArts,\n showContracts,\n showPayNotes,\n showCostNotes,\n showGoodsTransInvoicesToConsumers\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, stagesDataGrid.showStageContracts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Договоры этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageContractsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_contracts__WEBPACK_IMPORTED_MODULE_6__.StageContracts, {\n stage: stagesDataGrid.showStageContracts,\n filters: stagesDataGrid.stageContractsFilters\n })) : null, stagesDataGrid.showStageArts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Калькуляция этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageArtsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_arts__WEBPACK_IMPORTED_MODULE_5__.StageArts, {\n stage: stagesDataGrid.showStageArts,\n filters: stagesDataGrid.stageArtsFilters\n })) : null);\n};\n\n//Контроль свойств - Список этапов проекта\nStages.propTypes = {\n project: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n projectName: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_13___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stages.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Stages: () => (/* binding */ Stages)\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_12__ = __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 _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _stage_arts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stage_arts */ \"./app/panels/prj_fin/stage_arts.js\");\n/* harmony import */ var _stage_contracts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stage_contracts */ \"./app/panels/prj_fin/stage_contracts.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/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 //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список этапов проекта\nconst Stages = ({\n project,\n projectName,\n filters\n}) => {\n //Собственное состояние\n const [stagesDataGrid, setStagesDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedStageNumb: null,\n showStageArts: null,\n stageArtsFilters: [],\n showStageContracts: null,\n stageContractsFilters: []\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_7__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_8__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_9__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStages = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stagesDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_LIST\",\n args: {\n NPRN: project,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.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)(stagesDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stagesDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStagesDataGrid(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 >= configSystemPageSize\n }));\n }\n }, [project, stagesDataGrid.reload, stagesDataGrid.filters, stagesDataGrid.orders, stagesDataGrid.dataLoaded, stagesDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение журнала затрат по этапу проекта\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение расходных накладных на отпуск потребителям по этапу проекта\n const showGoodsTransInvoicesToConsumers = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"GoodsTransInvoicesToConsumers\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение статей калькуляции по этапу проекта\n const showStageArts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageArtsFilters: [...filters]\n }));\n\n //Отображение договоров с соисполнителями по этапу проекта\n const showContracts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageContractsFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStagesDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStagesDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStagesDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка договоров этапа\n const handleStageContractsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: null,\n stageContractsFilters: []\n }));\n\n //При закрытии калькуляции этапа\n const handleStageArtsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: null,\n stageArtsFilters: []\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStages();\n }, [stagesDataGrid.reload, loadStages]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n pt: 2\n }, stagesDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_10__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stagesDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stagesDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stagesDataGrid.morePages,\n reloading: stagesDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_11__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n showStageArts,\n showContracts\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n pOnlineShowDocument,\n showStageArts,\n showContracts,\n showPayNotes,\n showCostNotes,\n showGoodsTransInvoicesToConsumers\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, stagesDataGrid.showStageContracts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Договоры этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageContractsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_contracts__WEBPACK_IMPORTED_MODULE_6__.StageContracts, {\n stage: stagesDataGrid.showStageContracts,\n filters: stagesDataGrid.stageContractsFilters\n })) : null, stagesDataGrid.showStageArts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Калькуляция этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageArtsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_arts__WEBPACK_IMPORTED_MODULE_5__.StageArts, {\n stage: stagesDataGrid.showStageArts,\n filters: stagesDataGrid.stageArtsFilters\n })) : null);\n};\n\n//Контроль свойств - Список этапов проекта\nStages.propTypes = {\n project: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n projectName: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_13___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stages.js?");
/***/ }),
@@ -3711,7 +4327,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 */ 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 paddingLeft: \"10px\",\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?");
+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//Стили\nconst STYLES = {\n GROUP_CELL: {\n padding: \"2px\"\n },\n GROUP_CELL_LINK: {\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\",\n minWidth: \"800px\",\n maxWidth: \"800px\"\n },\n MONTH_CELL: {\n padding: \"2px\",\n maxWidth: \"30px\",\n overflow: \"visible\",\n fontSize: \"smaller\",\n whiteSpace: \"nowrap\"\n },\n MONTH_CELL_FILLED: state => ({\n backgroundColor: state == 0 ? \"lightyellow\" : state == 1 ? \"lightgreen\" : \"lightblue\",\n cursor: \"pointer\"\n }),\n JOB_CELL: {\n padding: \"2px\",\n paddingLeft: \"10px\",\n maxWidth: \"300px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\",\n fontSize: \"smaller\"\n }\n};\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: STYLES.GROUP_CELL,\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 sx: STYLES.GROUP_CELL_LINK,\n title: group.caption,\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 = STYLES.MONTH_CELL_FILLED(row.NSTATE);\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 ...STYLES.MONTH_CELL,\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: STYLES.JOB_CELL\n };\n }\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/layouts.js?");
/***/ }),
@@ -3722,7 +4338,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 */ 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 });\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 containerComponentProps: {\n elevation: 6,\n sx: {\n overflowX: \"visible\"\n }\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?");
+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 STYLES = {\n DATA_GRID_CONTAINER: {\n minWidth: \"95vw\",\n maxWidth: \"95vw\",\n minHeight: \"87vh\",\n maxHeight: \"87vh\"\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 fixedHeader: false,\n fixedColumns: 0\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 });\n setdataGrid(pv => ({\n ...pv,\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\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 pt: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\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 fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\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 containerComponentProps: {\n elevation: 3,\n sx: STYLES.DATA_GRID_CONTAINER\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?");
/***/ }),
@@ -3766,7 +4382,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 */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\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/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 _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 _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/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//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\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 loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_FACT_RPT\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(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 >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\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: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\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/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 _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 _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/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//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\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 loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_FACT_RPT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(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 >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\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: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?");
/***/ }),
@@ -3777,7 +4393,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 */ LabPlanFOTDtl: () => (/* binding */ LabPlanFOTDtl)\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/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\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 _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.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 LabPlanFOTDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по ФОТ ресурса\n const [planFOTDtl, setPlanFOTDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\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 loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planFOTDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_FOT\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planFOTDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planFOTDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planFOTDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanFOTDtl(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 >= configSystemPageSize\n }));\n }\n }, [periodId, planFOTDtl.reload, planFOTDtl.orders, planFOTDtl.dataLoaded, planFOTDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGOrderChanged = ({\n orders\n }) => setPlanFOTDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGPagesCountChanged = () => setPlanFOTDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planFOTDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planFOTDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n open: true,\n onClose: onHide\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planFOTDtl.columnsDef,\n rows: planFOTDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planFOTDtl.morePages,\n reloading: planFOTDtl.reload,\n onOrderChanged: handlePlanFOTDtlDGOrderChanged,\n onPagesCountChanged: handlePlanFOTDtlDGPagesCountChanged\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: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по ФОТ\nLabPlanFOTDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_fot_dtl.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanFOTDtl: () => (/* binding */ LabPlanFOTDtl)\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/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\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 _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.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 LabPlanFOTDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по ФОТ ресурса\n const [planFOTDtl, setPlanFOTDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\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 loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planFOTDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_FOT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planFOTDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planFOTDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planFOTDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanFOTDtl(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 >= configSystemPageSize\n }));\n }\n }, [periodId, planFOTDtl.reload, planFOTDtl.orders, planFOTDtl.dataLoaded, planFOTDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGOrderChanged = ({\n orders\n }) => setPlanFOTDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGPagesCountChanged = () => setPlanFOTDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planFOTDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planFOTDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n open: true,\n onClose: onHide\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planFOTDtl.columnsDef,\n rows: planFOTDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planFOTDtl.morePages,\n reloading: planFOTDtl.reload,\n onOrderChanged: handlePlanFOTDtlDGOrderChanged,\n onPagesCountChanged: handlePlanFOTDtlDGPagesCountChanged\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: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по ФОТ\nLabPlanFOTDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_fot_dtl.js?");
/***/ }),
@@ -3788,7 +4404,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 */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\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/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 _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 _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/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//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\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 loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST_PLAN_JOBS\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(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 >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\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: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\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/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 _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 _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/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//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\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 loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_JOBS_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(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 >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\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: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?");
/***/ }),
@@ -3810,7 +4426,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_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/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.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\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/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//---------\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: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\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_9__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"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_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"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 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_12__[\"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_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"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_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"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_12__[\"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: _layouts__WEBPACK_IMPORTED_MODULE_8__.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_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.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/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __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 _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/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 //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\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: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Диалог параметров инициализации панели\nconst InitPrmsDialog = ({\n dateBegin,\n dateFact,\n onOk,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [values, setValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dateBegin: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateBegin),\n dateFact: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateFact)\n });\n\n //Отработка воода значения в фильтр\n const handleValueTextFieldChanged = e => setValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"init-dialog-title\",\n \"aria-describedby\": \"init-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u044B \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0438\\u0437\\u0430\\u0446\\u0438\\u0438\"), /*#__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 style: {\n padding: \"10px\"\n },\n name: \"dateBegin\",\n type: \"date\",\n value: values.dateBegin,\n onChange: handleValueTextFieldChanged,\n label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u0435\\u0440\\u0432\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateFact\",\n type: \"date\",\n value: values.dateFact,\n onChange: handleValueTextFieldChanged,\n label: \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430 (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onOk ? onOk({\n dateBegin: new Date(values.dateBegin),\n dateFact: new Date(values.dateFact)\n }) : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_7__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitPrmsDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Область параметров инициализации панели\nconst InitPrmsArea = ({\n dateBegin,\n dateFact,\n durationMeasCode,\n labMeasCode,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateBegin), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateFact), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C: \"), durationMeasCode, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0451\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C: \"), labMeasCode)\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"refresh\"),\n onClick: onClick ? onClick : null\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C...\")));\n};\n\n//Контроль свойств - Область параметров инициализации панели\nInitPrmsArea.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date),\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_16___default().instanceOf(Date),\n durationMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().string),\n labMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().string),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//Область сохранения изменений\nconst SaveChangesArea = ({\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n fullWidth: true,\n color: \"warning\",\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, \"save\"),\n onClick: onClick\n }, \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\")));\n};\n\n//Контроль свойств - Область сохранения изменений\nSaveChangesArea.propTypes = {\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\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_17__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"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_22__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"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_19__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"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_23__[\"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_16___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___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 durationMeasCode: null,\n labMeas: null,\n labMeasCode: 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 showInitDialog: false\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) => {\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 }\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 ? state.dateBegin : null,\n DFACT: state.dateFact ? state.dateFact : null,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n reInit: false,\n dateBegin: new Date(data.DBEGIN),\n dateFact: new Date(data.DFACT),\n durationMeas: data.NDURATION_MEAS,\n durationMeasCode: data.SDURATION_MEAS,\n labMeas: data.NLAB_MEAS,\n labMeasCode: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, 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 }, [state.init, initJobs]);\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));\n };\n\n //Отработка нажатия на отображения диалога параметров инициализации панели\n const handleShowInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: true\n }));\n\n //Отработка нажатия на \"ОК\" в диалоге параметров инициализации панели\n const handleOKInitDialogClick = values => setState(pv => ({\n ...pv,\n dateBegin: values.dateBegin,\n dateFact: values.dateFact,\n showInitDialog: false,\n init: false\n }));\n\n //Отработка нажатия на \"Отмена\" в диалоге параметров инициализации панели\n const handleCancelInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: false\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_24__[\"default\"], {\n p: 2\n }, state.showInitDialog ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsDialog, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n onOk: handleOKInitDialogClick,\n onCancel: handleCancelInitDialogClick\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"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_20__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"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, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsArea, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n durationMeasCode: state.durationMeasCode,\n labMeasCode: state.labMeasCode,\n onClick: handleShowInitDialogClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null), state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SaveChangesArea, {\n onClick: handleSaveToProjectsClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], null)) : 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_25__[\"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_20__[\"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_26__[\"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_8__.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_28__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"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: _layouts__WEBPACK_IMPORTED_MODULE_9__.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?");
/***/ }),
@@ -3825,6 +4441,72 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./app/panels/rrp_conf_editor/custom_dialog.js":
+/*!*****************************************************!*\
+ !*** ./app/panels/rrp_conf_editor/custom_dialog.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 */ CustomDialog: () => (/* binding */ CustomDialog)\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_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 _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.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/DialogTitle/DialogTitle.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/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _custom_form_control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./custom_form_control */ \"./app/panels/rrp_conf_editor/custom_form_control.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./layouts */ \"./app/panels/rrp_conf_editor/layouts.js\");\n/*\r\n Кастомный Dialog\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Кастомные строки ввода\n //Статусы и стили диалогового окна\n\n//-----------\n//Тело модуля\n//-----------\n\nconst CustomDialog = props => {\n const {\n formOpen,\n closeForm,\n curStatus,\n curCode,\n curName,\n curColCode,\n curRowCode,\n btnOkClick,\n codeOnChange,\n nameOnChange,\n dictColumnClick,\n dictRowClick\n } = props;\n\n //Формирование заголовка диалогового окна\n const formTitle = () => {\n switch (curStatus) {\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.CREATE:\n return \"Добавление раздела\";\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.EDIT:\n return \"Исправление раздела\";\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.DELETE:\n return \"Удаление раздела\";\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_CREATE:\n return \"Добавление показателя раздела\";\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_EDIT:\n return \"Исправление показателя раздела\";\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_DELETE:\n return \"Удаление показателя раздела\";\n }\n };\n\n //Отрисовка диалогового окна\n const renderSwitch = () => {\n var btnText = \"\";\n switch (curStatus) {\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.CREATE:\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_CREATE:\n btnText = \"Добавить\";\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.EDIT:\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_EDIT:\n btnText = \"Исправить\";\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.DELETE:\n case _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_DELETE:\n btnText = \"Удалить\";\n break;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"contained\",\n onClick: btnOkClick\n }, btnText);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: formOpen,\n onClose: closeForm\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, formTitle()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n \"aria-label\": \"close\",\n onClick: closeForm,\n sx: {\n position: \"absolute\",\n right: 8,\n top: 8,\n color: theme => theme.palette.grey[500]\n }\n }, /*#__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_8__[\"default\"], null, curStatus == _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.DELETE || curStatus == _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_DELETE ? curStatus == _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.DELETE ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"\\u0412\\u044B \\u0445\\u043E\\u0442\\u0438\\u0442\\u0435 \\u0443\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B \", curName, \"?\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"\\u0412\\u044B \\u0445\\u043E\\u0442\\u0438\\u0442\\u0435 \\u0443\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u043F\\u043E\\u043A\\u0430\\u0437\\u0430\\u0442\\u0435\\u043B\\u044C \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0430 \", curName, \"?\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, curStatus != _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_EDIT ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_custom_form_control__WEBPACK_IMPORTED_MODULE_1__.CustomFormControl, {\n elementCode: \"code\",\n elementValue: curCode,\n labelText: \"\\u041C\\u043D\\u0435\\u043C\\u043E\\u043A\\u043E\\u0434\",\n changeFunc: codeOnChange\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_custom_form_control__WEBPACK_IMPORTED_MODULE_1__.CustomFormControl, {\n elementCode: \"name\",\n elementValue: curName,\n labelText: \"\\u041D\\u0430\\u0438\\u043C\\u0435\\u043D\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435\",\n changeFunc: nameOnChange\n }), curStatus == _layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses.COLUMNROW_CREATE ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_custom_form_control__WEBPACK_IMPORTED_MODULE_1__.CustomFormControl, {\n elementCode: \"column\",\n elementValue: curColCode,\n labelText: \"\\u0413\\u0440\\u0430\\u0444\\u0430\",\n changeFunc: dictColumnClick,\n withDictionary: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_custom_form_control__WEBPACK_IMPORTED_MODULE_1__.CustomFormControl, {\n elementCode: \"row\",\n elementValue: curRowCode,\n labelText: \"\\u0421\\u0442\\u0440\\u043E\\u043A\\u0430\",\n changeFunc: dictRowClick,\n withDictionary: true\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: _layouts__WEBPACK_IMPORTED_MODULE_2__.STYLES.PADDING_DIALOG_BUTTONS_RIGHT\n }, renderSwitch(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"contained\",\n onClick: closeForm\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0430\")));\n};\nCustomDialog.propTypes = {\n formOpen: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().bool).isRequired,\n closeForm: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func).isRequired,\n curStatus: prop_types__WEBPACK_IMPORTED_MODULE_11___default().oneOf(Object.values(_layouts__WEBPACK_IMPORTED_MODULE_2__.Statuses).filter(x => typeof x === \"number\")),\n curCode: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string),\n curName: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string),\n curColCode: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string),\n curRowCode: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().string),\n btnOkClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func).isRequired,\n codeOnChange: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func).isRequired,\n nameOnChange: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func).isRequired,\n dictColumnClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func).isRequired,\n dictRowClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/custom_dialog.js?");
+
+/***/ }),
+
+/***/ "./app/panels/rrp_conf_editor/custom_form_control.js":
+/*!***********************************************************!*\
+ !*** ./app/panels/rrp_conf_editor/custom_form_control.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 */ CustomFormControl: () => (/* binding */ CustomFormControl)\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_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/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/OutlinedInput/OutlinedInput.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputAdornment/InputAdornment.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./layouts */ \"./app/panels/rrp_conf_editor/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 Кастомный FormControl\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Стили диалогового окна\n\n//-----------\n//Тело модуля\n//-----------\n\nconst CustomFormControl = props => {\n const {\n elementCode,\n elementValue,\n labelText,\n changeFunc,\n withDictionary,\n ...other\n } = props;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n p: 1\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _extends({\n sx: _layouts__WEBPACK_IMPORTED_MODULE_1__.STYLES.DIALOG_WINDOW_WIDTH\n }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n htmlFor: `${elementCode}-outlined`\n }, labelText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n id: `${elementCode}-outlined`,\n value: elementValue ? elementValue : \"\",\n onChange: !withDictionary ? e => changeFunc(e.target.value) : null,\n \"aria-describedby\": `${elementCode}-outlined-helper-text`,\n label: labelText,\n endAdornment: withDictionary ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n position: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n \"aria-label\": `${elementCode} select`,\n onClick: changeFunc,\n edge: \"end\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, \"list\"))) : null\n })));\n};\nCustomFormControl.propTypes = {\n elementCode: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n elementValue: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string),\n labelText: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n changeFunc: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func).isRequired,\n withDictionary: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().bool)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/custom_form_control.js?");
+
+/***/ }),
+
+/***/ "./app/panels/rrp_conf_editor/custom_tab_panel.js":
+/*!********************************************************!*\
+ !*** ./app/panels/rrp_conf_editor/custom_tab_panel.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 */ CustomTabPanel: () => (/* binding */ CustomTabPanel)\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_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.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 Кастомный Tab\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//-----------\n//Тело модуля\n//-----------\n\nconst 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_1__[\"default\"], {\n sx: {\n p: 3\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, children)));\n};\nCustomTabPanel.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().node),\n index: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n value: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/custom_tab_panel.js?");
+
+/***/ }),
+
+/***/ "./app/panels/rrp_conf_editor/index.js":
+/*!*********************************************!*\
+ !*** ./app/panels/rrp_conf_editor/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 _rrp_conf_editor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rrp_conf_editor */ \"./app/panels/rrp_conf_editor/rrp_conf_editor.js\");\n/*\r\n Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта\r\n Панель мониторинга: Точка входа\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Корневая панель выполнения работ\n\n//----------------\n//Интерфейс модуля\n//----------------\n\nconst RootClass = _rrp_conf_editor__WEBPACK_IMPORTED_MODULE_0__.RrpConfEditor;\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/index.js?");
+
+/***/ }),
+
+/***/ "./app/panels/rrp_conf_editor/layouts.js":
+/*!***********************************************!*\
+ !*** ./app/panels/rrp_conf_editor/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 */ STYLES: () => (/* binding */ STYLES),\n/* harmony export */ Statuses: () => (/* binding */ Statuses),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender)\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/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\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/*\r\n Парус 8 - \r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\nconst STYLES = {\n DIALOG_WINDOW_WIDTH: {\n width: 400\n },\n PADDING_DIALOG_BUTTONS_RIGHT: {\n paddingRight: \"32px\"\n }\n};\n\n//Статусы диалогового окна\nconst Statuses = {\n CREATE: 0,\n EDIT: 1,\n DELETE: 2,\n COLUMNROW_CREATE: 3,\n COLUMNROW_EDIT: 4,\n COLUMNROW_DELETE: 5\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}, editCR, deleteCR) => {\n let data = row[columnDef.name];\n columnDef.name != \"SROW_NAME\" && data != undefined && columnDef.visible == true ? data = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n width: \"-webkit-fill-available\"\n }, row[columnDef.name]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n justifyContent: \"flex-end\",\n onClick: () => editCR(row[\"NRN_\" + columnDef.name.substring(5)], row[columnDef.name])\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"edit\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n justifyContent: \"flex-end\",\n onClick: () => deleteCR(row[\"NRN_\" + columnDef.name.substring(5)], row[columnDef.name])\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"delete\"))) : null;\n return {\n data\n };\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/layouts.js?");
+
+/***/ }),
+
+/***/ "./app/panels/rrp_conf_editor/rrp_conf_editor.js":
+/*!*******************************************************!*\
+ !*** ./app/panels/rrp_conf_editor/rrp_conf_editor.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 */ RrpConfEditor: () => (/* binding */ RrpConfEditor)\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_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Tabs/Tabs.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Tab/Tab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _custom_tab_panel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./custom_tab_panel */ \"./app/panels/rrp_conf_editor/custom_tab_panel.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/rrp_conf_editor/layouts.js\");\n/* harmony import */ var _custom_dialog__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./custom_dialog */ \"./app/panels/rrp_conf_editor/custom_dialog.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*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст навигации\n //Кастомный Tab\n //Контекст приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n //Кастомное диалоговое окно\n\n//-----------\n//Тело модуля\n//-----------\n\n//Редактор настройки регламентированного отчёта\nconst RrpConfEditor = () => {\n const dataGrid = {\n rn: 0,\n code: \"\",\n name: \"\",\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: false\n };\n\n //Собственное состояние\n const [rrpDoc, setRrpDoc] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n docLoaded: false,\n sections: [],\n reload: true\n });\n\n //Состояние массива данных разделов\n const [dataGrids] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Состояние раздела\n const [tabValue, setTabValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Состояние открытия диалогового окна\n const [formOpen, setForm] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Состояние диалогового окна\n const [formData, setFormData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n filled: false,\n rn: \"\",\n prn: \"\",\n sctnName: \"\",\n sctnCode: \"\",\n status: \"\",\n code: \"\",\n name: \"\",\n colName: \"\",\n colCode: \"\",\n colVCode: \"\",\n colVRn: 0,\n rowName: \"\",\n rowCode: \"\",\n rowVCode: \"\",\n rowVRn: 0\n });\n\n //Открытие диалогового окна\n const openForm = () => {\n setForm(true);\n };\n\n //Закрытие диалогового окна\n const closeForm = () => {\n setForm(false);\n };\n\n //Очистка диалогового окна\n const clearFormData = () => {\n setFormData({\n rn: \"\",\n code: \"\",\n name: \"\"\n });\n };\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_6__[\"ApplicationСtx\"]);\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_4__.NavigationCtx);\n\n //Переключение раздела\n const handleChange = (event, newValue) => {\n setTabValue(newValue);\n };\n\n //Отработка нажатия на кнопку добавления секции\n const addSectionClick = () => {\n setFormData({\n status: _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.CREATE,\n prn: Number(getNavigationSearch().NRN)\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку исправления секции\n const editSectionClick = (rn, code, name) => {\n setFormData({\n rn: rn,\n code: code,\n name: name,\n status: _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.EDIT\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку удаления секции\n const deleteSectionClick = (rn, code, name) => {\n setFormData({\n rn: rn,\n code: code,\n name: name,\n status: _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.DELETE\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку добавления показателя раздела\n const addColumnRowClick = (prn, sctnCode, sctnName) => {\n setFormData({\n status: _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_CREATE,\n prn: prn,\n sctnCode: sctnCode,\n sctnName: sctnName\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку исправления показателя раздела\n const editColumnRowClick = (rn, name) => {\n setFormData({\n status: _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_EDIT,\n rn: rn,\n name: name\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку удаления показателя раздела\n const deleteColumnRowClick = (rn, name) => {\n setFormData({\n status: _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_DELETE,\n rn: rn,\n name: name\n });\n openForm();\n };\n\n //Отработка нажатия на словарь граф\n const dictColumnClick = () => {\n pOnlineShowDictionary({\n unitCode: \"RRPColumn\",\n callBack: res => res.success === true ? setFormData(pv => ({\n ...pv,\n colCode: res.outParameters.out_CODE,\n colVCode: res.outParameters.out_RRPVERSION_CODE,\n colVRn: res.outParameters.out_RRPVERSION\n })) : null\n });\n };\n\n //Отработка нажатия на словарь строк\n const dictRowClick = () => {\n pOnlineShowDictionary({\n unitCode: \"RRPRow\",\n callBack: res => res.success === true ? setFormData(pv => ({\n ...pv,\n rowCode: res.outParameters.out_CODE,\n rowVCode: res.outParameters.out_RRPVERSION_CODE,\n rowVRn: res.outParameters.out_RRPVERSION\n })) : null\n });\n };\n\n //Нажатие на кнопку подтверждения создания/исправления/удаления на форме\n const formBtnOkClick = () => {\n let formStateProps = {};\n if (formData.status === (_layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.CREATE || _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.EDIT || _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_CREATE)) formStateProps = {\n ...formStateProps,\n code: document.querySelector(\"#code-outlined\").value\n };\n if (formData.status === (_layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.CREATE || _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.EDIT || _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_CREATE || _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_EDIT)) formStateProps = {\n ...formStateProps,\n name: document.querySelector(\"#name-outlined\").value\n };\n setFormData(pv => ({\n ...pv,\n ...formStateProps,\n filled: true\n }));\n closeForm();\n };\n\n //Формирование разделов\n const a11yProps = index => {\n return {\n id: `simple-tab-${index}`,\n \"aria-controls\": `simple-tabpanel-${index}`\n };\n };\n\n //Отработка изменений в разделе или показателе раздела\n const changeSections = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (formData.filled) {\n switch (formData.status) {\n case _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.CREATE:\n insertSections();\n clearFormData();\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.EDIT:\n updateSections();\n clearFormData();\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.DELETE:\n deleteSections();\n clearFormData();\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_CREATE:\n addColumnRow();\n clearFormData();\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_EDIT:\n editColumnRow();\n clearFormData();\n break;\n case _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_DELETE:\n deleteColumnRow();\n clearFormData();\n break;\n }\n setRrpDoc(pv => ({\n ...pv,\n reload: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [formData]);\n\n //Добавление раздела\n const insertSections = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.INSERT_RRPCONF_SECTIONS\",\n args: {\n NPRN: formData.prn,\n SCODE: formData.code,\n SNAME: formData.name\n }\n });\n setFormData(pv => ({\n ...pv,\n rn: Number(data.NRN)\n }));\n }, [formData.prn, formData.code, formData.name, executeStored]);\n\n //Исправление раздела\n const updateSections = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.UPDATE_RRPCONF_SECTIONS\",\n args: {\n NRN: formData.rn,\n SCODE: formData.code,\n SNAME: formData.name\n }\n });\n }, [formData.name, formData.code, formData.rn, executeStored]);\n\n //Удаление раздела\n const deleteSections = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.DELETE_RRPCONF_SECTIONS\",\n args: {\n NRN: formData.rn\n }\n });\n }, [formData.rn, executeStored]);\n\n //Добавление показателя раздела\n const addColumnRow = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.INSERT_RRPCONF_COLUMNROW\",\n args: {\n NPRN: formData.prn,\n SCODE: formData.code,\n SNAME: formData.name,\n SCOLCODE: formData.colCode,\n SCOLVER: formData.colVCode,\n SROWCODE: formData.rowCode,\n SROWVER: formData.rowVCode\n }\n });\n }, [executeStored, formData.code, formData.colVCode, formData.colCode, formData.name, formData.prn, formData.rowCode, formData.rowVCode]);\n\n //Исправление показателя раздела\n const editColumnRow = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.UPDATE_RRPCONF_COLUMNROW\",\n args: {\n NRN: formData.rn,\n SNAME: formData.name\n }\n });\n }, [executeStored, formData.name, formData.rn]);\n\n //Удаление показателя раздела\n const deleteColumnRow = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.DELETE_RRPCONF_COLUMNROW\",\n args: {\n NRN: formData.rn\n }\n });\n }, [executeStored, formData.rn]);\n\n //Получение мнемокода и наименования показателя раздела\n const getSctnMrkCodeName = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.GET_RRPCONFSCTNMRK_CODE_NAME\",\n args: {\n SSCTNCODE: formData.sctnCode,\n SROWCODE: formData.rowCode,\n SCOLUMNCODE: formData.colCode\n }\n });\n setFormData(pv => ({\n ...pv,\n code: data.SCODE,\n name: data.SNAME\n }));\n }, [executeStored, formData.colCode, formData.rowCode, formData.sctnCode]);\n\n //Загрузка данных разделов регламентированного отчёта\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (rrpDoc.reload) {\n //Переменная номера раздела с фокусом\n let tabFocus = 0;\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.GET_RRPCONF_SECTIONS\",\n args: {\n NRN_RRPCONF: Number(getNavigationSearch().NRN)\n },\n respArg: \"COUT\"\n });\n //Флаг первой загрузки данных\n let firstLoad = dataGrids.length == 0 ? true : false;\n //Копирование массива уже загруженных разделов\n let cloneDGs = dataGrids.slice();\n //Массив из нескольких разделов и из одного\n const sections = data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS];\n //Заполнение очередного раздела по шаблону\n sections.map(s => {\n let dg = {};\n Object.assign(dg, dataGrid, {\n rn: s.NRN,\n code: s.SCODE,\n name: s.SNAME,\n dataLoaded: true,\n columnsDef: [...(s.XDATA.XCOLUMNS_DEF || [])],\n groups: [...(s.XDATA.XGROUPS || [])],\n rows: [...(s.XDATA.XROWS || [])],\n reload: false\n });\n //Ищем загружен ли уже раздел с таким же ид.\n const dgItem = dataGrids.find(x => x.rn === dg.rn);\n //Его индекс, если нет соответствия, то -1\n let index = dataGrids.indexOf(dgItem);\n //Если было соответствие\n if (dgItem) {\n //Если в нём не найдено изменений\n if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {\n //То из копированного массива его удаляем\n cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);\n } else {\n //Иначе обновляем раздел в массиве\n dataGrids[index] = dg;\n //Удаляем из копированного массива\n cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);\n //Устанавливаем фокус на обновлённый раздел\n tabFocus = index;\n }\n } else {\n //Если раздел новый, то добавляем его в массив данных\n dataGrids.push(dg);\n //И устанавливаем на него фокус, если флаг первой загрузки = false\n tabFocus = !firstLoad ? dataGrids.length - 1 : 0;\n }\n });\n //Обходим разделы, что остались в копированном массиве (на удаление)\n cloneDGs.map(s => {\n let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));\n //Устаревший раздел удаляем из массива данных\n dataGrids.splice(curIndex, 1);\n //Фокус на предшествующий раздел\n tabFocus = curIndex - 1;\n });\n setRrpDoc(pv => ({\n ...pv,\n docLoaded: true,\n reload: false,\n sections: dataGrids\n }));\n setTabValue(tabFocus);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rrpDoc.reload, rrpDoc.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [rrpDoc.reload, dataGrid.reload, loadData]);\n\n //Обновление при изменении разделов\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n changeSections();\n }, [changeSections]);\n\n //Получение наименования и мнемокода показателя раздела при заполнении необходимых полей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n formData.status == _layouts__WEBPACK_IMPORTED_MODULE_7__.Statuses.COLUMNROW_CREATE && formData.sctnName && formData.sctnCode && formData.colCode && formData.rowCode ? getSctnMrkCodeName() : null;\n }, [formData.colCode, formData.rowCode, formData.sctnCode, formData.sctnName, formData.status, getSctnMrkCodeName]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n width: \"100%\"\n }\n }, formOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_custom_dialog__WEBPACK_IMPORTED_MODULE_8__.CustomDialog, {\n formOpen: formOpen,\n closeForm: closeForm,\n curStatus: formData.status,\n curCode: formData.code,\n curName: formData.name,\n curColCode: formData.colCode,\n curRowCode: formData.rowCode,\n btnOkClick: formBtnOkClick,\n codeOnChange: v => setFormData(pv => ({\n ...pv,\n code: v\n })),\n nameOnChange: v => setFormData(pv => ({\n ...pv,\n name: v\n })),\n dictColumnClick: dictColumnClick,\n dictRowClick: dictRowClick\n }) : null, rrpDoc.docLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n borderBottom: 1,\n borderColor: \"divider\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n direction: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n value: tabValue,\n onChange: handleChange,\n \"aria-label\": \"section tab\"\n }, rrpDoc.sections.map((s, i) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], _extends({\n key: s.rn\n }, a11yProps(i), {\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n direction: \"row\",\n textAlign: \"center\"\n }, s.name, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => editSectionClick(s.rn, s.code, s.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"edit\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => deleteSectionClick(s.rn, s.code, s.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"delete\"))),\n wrapped: true\n }));\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: addSectionClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"add\"))), rrpDoc.sections.map((s, i) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_custom_tab_panel__WEBPACK_IMPORTED_MODULE_5__.CustomTabPanel, {\n key: s.rn,\n value: tabValue,\n index: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"contained\",\n onClick: () => addColumnRowClick(s.rn, s.code, s.name)\n }, \"+ \\u0414\\u043E\\u0431\\u0430\\u0432\\u0438\\u0442\\u044C\"), s.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: s.columnsDef,\n groups: s.groups,\n rows: s.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: s.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.dataCellRender)({\n ...prms\n }, editColumnRowClick, deleteColumnRowClick)\n })) : null);\n })) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/rrp_conf_editor.js?");
+
+/***/ }),
+
/***/ "./app/panels/samples/chart.js":
/*!*************************************!*\
!*** ./app/panels/samples/chart.js ***!
@@ -3843,7 +4525,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: 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?");
+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_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_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.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/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.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\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.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\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 DATA_GRID_CONTAINER: {\n maxWidth: 700,\n maxHeight: 500,\n minHeight: 500\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_6__[\"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_7__[\"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 fixedHeader: false,\n fixedColumns: 0\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 {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationС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 fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\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 const handleAgnButtonClicked = agnCode => pOnlineShowDocument({\n unitCode: \"AGNLIST\",\n document: agnCode,\n inRnParameter: \"in_AGNABBR\"\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_8__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n p: 5,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\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 containerComponentProps: {\n elevation: 6,\n style: STYLES.DATA_GRID_CONTAINER\n },\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 fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\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 expandable: true,\n rowExpandRender: ({\n row\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: () => handleAgnButtonClicked(row.SAGNABBR)\n }, \"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u0442\\u044C \\u0432 \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\")\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?");
/***/ }),
@@ -3920,7 +4602,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 */ Samples: () => (/* binding */ Samples)\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_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.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/Button/Button.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _p8online__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8online */ \"./app/panels/samples/p8online.js\");\n/* harmony import */ var _mui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mui */ \"./app/panels/samples/mui.js\");\n/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./messages */ \"./app/panels/samples/messages.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader */ \"./app/panels/samples/loader.js\");\n/* harmony import */ var _data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./data_grid */ \"./app/panels/samples/data_grid.js\");\n/* harmony import */ var _chart__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./chart */ \"./app/panels/samples/chart.js\");\n/* harmony import */ var _gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./gantt */ \"./app/panels/samples/gantt.js\");\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Панель мониторинга: Примеры для разработчиков\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Текстовые ресурсы и константы\n //Пример: API для взаимодействия с \"ПАРУС 8 Онлайн\"\n //Пример: Компоненты MUI\n //Пример: Сообщения\n //Пример: Индикатор процесса\n //Пример: Таблица данных \"P8PDataGrid\"\n //Пример: Графики \"P8PChart\"\n //Пример: Диаграмма Ганта \"P8PGantt\"\n\n//---------\n//Константы\n//---------\n\n//Режимы\nconst MODES = {\n P8ONLINE: {\n name: \"P8ONLINE\",\n caption: 'API для взаимодействия с \"ПАРУС 8 Онлайн\"',\n component: _p8online__WEBPACK_IMPORTED_MODULE_2__.P8Online\n },\n MUI: {\n name: \"MUI\",\n caption: \"Компоненты MUI\",\n component: _mui__WEBPACK_IMPORTED_MODULE_3__.Mui\n },\n MESSAGES: {\n name: \"MESSAGES\",\n caption: \"Сообщения\",\n component: _messages__WEBPACK_IMPORTED_MODULE_4__.Messages\n },\n LOADER: {\n name: \"LOADER\",\n caption: \"Индикатор процесса\",\n component: _loader__WEBPACK_IMPORTED_MODULE_5__.Loader\n },\n DATAGRID: {\n name: \"DATAGRID\",\n caption: 'Таблица данных \"P8PDataGrid\"',\n component: _data_grid__WEBPACK_IMPORTED_MODULE_6__.DataGrid\n },\n CHART: {\n name: \"CHART\",\n caption: 'Графики \"P8PChart\"',\n component: _chart__WEBPACK_IMPORTED_MODULE_7__.Chart\n },\n GANTT: {\n name: \"GANTT\",\n caption: 'Диаграмма Ганта \"P8PGantt\"',\n component: _gantt__WEBPACK_IMPORTED_MODULE_8__.Gantt\n }\n};\n\n//Стили\nconst STYLES = {\n ROOT: {\n height: \"calc(100vh - 64px)\"\n },\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n BACK_BUTTON: {\n position: \"absolute\",\n left: \"20px\",\n marginTop: \"20px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Примеры\nconst Samples = () => {\n //Собственное состояние\n const [mode, setMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.ROOT\n }, mode ? /*#__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_9__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.BACK_BUTTON,\n onClick: () => setMode(\"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, \"arrow_back_ios\"), _app_text__WEBPACK_IMPORTED_MODULE_1__.BUTTONS.NAVIGATE_BACK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MODES[mode]?.component || (() => {}), {\n title: MODES[mode]?.caption\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, Object.entries(MODES).map(m => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: m[0]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: () => setMode(m[1].name)\n }, m[1].caption)))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/samples.js?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Samples: () => (/* binding */ Samples)\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_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.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 _app_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _p8online__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8online */ \"./app/panels/samples/p8online.js\");\n/* harmony import */ var _mui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mui */ \"./app/panels/samples/mui.js\");\n/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./messages */ \"./app/panels/samples/messages.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader */ \"./app/panels/samples/loader.js\");\n/* harmony import */ var _data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./data_grid */ \"./app/panels/samples/data_grid.js\");\n/* harmony import */ var _chart__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./chart */ \"./app/panels/samples/chart.js\");\n/* harmony import */ var _gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./gantt */ \"./app/panels/samples/gantt.js\");\n/* harmony import */ var _svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svg */ \"./app/panels/samples/svg.js\");\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Панель мониторинга: Примеры для разработчиков\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Текстовые ресурсы и константы\n //Пример: API для взаимодействия с \"ПАРУС 8 Онлайн\"\n //Пример: Компоненты MUI\n //Пример: Сообщения\n //Пример: Индикатор процесса\n //Пример: Таблица данных \"P8PDataGrid\"\n //Пример: Графики \"P8PChart\"\n //Пример: Диаграмма Ганта \"P8PGantt\"\n //Пример: Интерактивные изображения \"P8PSVG\"\n\n//---------\n//Константы\n//---------\n\n//Режимы\nconst MODES = {\n P8ONLINE: {\n name: \"P8ONLINE\",\n caption: 'API для взаимодействия с \"ПАРУС 8 Онлайн\"',\n component: _p8online__WEBPACK_IMPORTED_MODULE_2__.P8Online\n },\n MUI: {\n name: \"MUI\",\n caption: \"Компоненты MUI\",\n component: _mui__WEBPACK_IMPORTED_MODULE_3__.Mui\n },\n MESSAGES: {\n name: \"MESSAGES\",\n caption: \"Сообщения\",\n component: _messages__WEBPACK_IMPORTED_MODULE_4__.Messages\n },\n LOADER: {\n name: \"LOADER\",\n caption: \"Индикатор процесса\",\n component: _loader__WEBPACK_IMPORTED_MODULE_5__.Loader\n },\n DATAGRID: {\n name: \"DATAGRID\",\n caption: 'Таблица данных \"P8PDataGrid\"',\n component: _data_grid__WEBPACK_IMPORTED_MODULE_6__.DataGrid\n },\n CHART: {\n name: \"CHART\",\n caption: 'Графики \"P8PChart\"',\n component: _chart__WEBPACK_IMPORTED_MODULE_7__.Chart\n },\n GANTT: {\n name: \"GANTT\",\n caption: 'Диаграмма Ганта \"P8PGantt\"',\n component: _gantt__WEBPACK_IMPORTED_MODULE_8__.Gantt\n },\n SVG: {\n name: \"SVG\",\n caption: 'Интерактивные изображения \"P8PSVG\"',\n component: _svg__WEBPACK_IMPORTED_MODULE_9__.Svg\n }\n};\n\n//Стили\nconst STYLES = {\n ROOT: {\n height: \"calc(100vh - 64px)\"\n },\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n BACK_BUTTON: {\n position: \"absolute\",\n left: \"20px\",\n marginTop: \"20px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Примеры\nconst Samples = () => {\n //Собственное состояние\n const [mode, setMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.ROOT\n }, mode ? /*#__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_10__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.BACK_BUTTON,\n onClick: () => setMode(\"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"arrow_back_ios\"), _app_text__WEBPACK_IMPORTED_MODULE_1__.BUTTONS.NAVIGATE_BACK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MODES[mode]?.component || (() => {}), {\n title: MODES[mode]?.caption\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, Object.entries(MODES).map(m => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: m[0]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => setMode(m[1].name)\n }, m[1].caption)))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/samples.js?");
+
+/***/ }),
+
+/***/ "./app/panels/samples/svg.js":
+/*!***********************************!*\
+ !*** ./app/panels/samples/svg.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 */ Svg: () => (/* binding */ Svg)\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_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControl/FormControl.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormLabel/FormLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/RadioGroup/RadioGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Radio/Radio.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 _components_p8p_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_svg */ \"./app/components/p8p_svg.js\");\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Интерактивные изображения \"P8PSVG\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Интерактивные изображения\n\n//---------\n//Константы\n//---------\n\n//Адрес тестового изображения\nconst SAMPLE_URL = \"img/sample.svg\";\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n FORM: {\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n SVG: {\n height: \"30vw\",\n display: \"flex\",\n justifyContent: \"center\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Интерактивные изображения \"P8PSVG\"\nconst Svg = ({\n title\n}) => {\n //Собственное состояние - SVG-изображение\n const [svg, setSVG] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n data: null,\n mode: \"items1\",\n items1: [{\n id: \"1\",\n backgroundColor: \"red\",\n desc: \"Цифра на флюзеляже\",\n title: \"Цифра на флюзеляже\"\n }, {\n id: \"2\",\n backgroundColor: \"magenta\",\n desc: \"Ребро флюзеляжа\",\n title: \"Ребро флюзеляжа\"\n }, {\n id: \"3\",\n backgroundColor: \"yellow\",\n desc: \"Люк\",\n title: \"Люк\"\n }],\n items2: [{\n id: \"4\",\n backgroundColor: \"green\",\n desc: \"Хвост\",\n title: \"Хвост\"\n }, {\n id: \"5\",\n backgroundColor: \"blue\",\n desc: \"Хвостовой руль\",\n title: \"Хвостовой руль\"\n }, {\n id: \"6\",\n backgroundColor: \"aquamarine\",\n desc: \"Ребро жесткости хвоста\",\n title: \"Ребро жесткости хвоста\"\n }],\n items3: [{\n id: \"7\",\n backgroundColor: \"blueviolet\",\n desc: \"Крыло левое\",\n title: \"Крыло левое\"\n }, {\n id: \"8\",\n backgroundColor: \"orange\",\n desc: \"Двигатель левый\",\n title: \"Двигатель левый\"\n }, {\n id: \"9\",\n backgroundColor: \"springgreen\",\n desc: \"Крыло правое\",\n title: \"Крыло правое\"\n }],\n selectedItemDesc: \"\"\n });\n\n //Загрузка изображения\n const loadSVG = async () => {\n const resp = await fetch(SAMPLE_URL);\n const data = await resp.text();\n setSVG(pv => ({\n ...pv,\n loaded: true,\n data\n }));\n };\n\n //Отработка нажатия на изображение\n const handleSVGClick = () => {\n setSVG(pv => ({\n ...pv,\n selectedItemDesc: \"Выбрано изображение целиком\"\n }));\n };\n\n //Отработка нажатия на элемент изображения\n const handleSVGItemClick = ({\n item\n }) => {\n setSVG(pv => ({\n ...pv,\n selectedItemDesc: item?.desc ? `Выбран элемент: ${item.desc}` : \"Для выбранного элемента не задано описание\"\n }));\n };\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadSVG();\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_2__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.FORM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, \"\\u0413\\u0440\\u0443\\u043F\\u043F\\u0430 \\u044D\\u043B\\u0435\\u043C\\u0435\\u043D\\u0442\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n row: true,\n value: svg.mode,\n onChange: e => setSVG(pv => ({\n ...pv,\n mode: e.target.value,\n selectedItemDesc: \"\"\n }))\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n value: \"items1\",\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null),\n label: \"\\u041F\\u0435\\u0440\\u0432\\u0430\\u044F\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n value: \"items2\",\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null),\n label: \"\\u0412\\u0442\\u043E\\u0440\\u0430\\u044F\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n value: \"items3\",\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null),\n label: \"\\u0422\\u0440\\u0435\\u0442\\u044C\\u044F\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, svg.selectedItemDesc ? svg.selectedItemDesc : \"Нажмите на элемент изображения для получения его описания\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 0,\n pt: 5,\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 }, svg.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_svg__WEBPACK_IMPORTED_MODULE_1__.P8PSVG, {\n data: svg.data,\n items: svg[svg.mode],\n onClick: handleSVGClick,\n onItemClick: handleSVGItemClick,\n canvasStyle: STYLES.SVG,\n fillOpacity: \"0.4\"\n }) : null)));\n};\n\n//Контроль свойств - Пример: Интерактивные изображения \"P8PSVG\"\nSvg.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/svg.js?");
/***/ }),
diff --git a/docs/Image Sources.pptx b/docs/Image Sources.pptx
index 86dd53a..cd2d093 100644
Binary files a/docs/Image Sources.pptx and b/docs/Image Sources.pptx differ
diff --git a/docs/img/66.png b/docs/img/66.png
index e01102f..7ddb599 100644
Binary files a/docs/img/66.png and b/docs/img/66.png differ
diff --git a/docs/img/68.png b/docs/img/68.png
index 21c3ed2..7b61824 100644
Binary files a/docs/img/68.png and b/docs/img/68.png differ
diff --git a/docs/img/69.png b/docs/img/69.png
index 312e603..7db7a11 100644
Binary files a/docs/img/69.png and b/docs/img/69.png differ
diff --git a/docs/img/70.png b/docs/img/70.png
new file mode 100644
index 0000000..aef42bc
Binary files /dev/null and b/docs/img/70.png differ
diff --git a/docs/img/71.png b/docs/img/71.png
new file mode 100644
index 0000000..6a95b1b
Binary files /dev/null and b/docs/img/71.png differ
diff --git a/img/sample.svg b/img/sample.svg
new file mode 100644
index 0000000..cb3c008
--- /dev/null
+++ b/img/sample.svg
@@ -0,0 +1,955 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/p8panels.config b/p8panels.config
index e7d4535..4d884e1 100644
--- a/p8panels.config
+++ b/p8panels.config
@@ -21,6 +21,10 @@
+
+
+
+
@@ -84,6 +88,46 @@
icon="calendar_month"
showInPanelsList="true"
preview="./img/mech_rec_cost_prod_plans.jpg"/>
+
+
+
+
+