` для всёрстки - для этого в [MUI](https://mui.com/) есть группа компонентов разметки ("Layout"), используйте их (`Grid`, `Box`, `Container`, `Stack`, `Paper` и пр.).
+- Старайтесь не использовать, без острой необходимости, атрибуты `sx` и `style` - всё необходимое для стилизации как правило есть в типовых атрибутах компонента [MUI](https://mui.com/), изучите его документацию. Если применение собственного стиля неизбежно - старайтесь выносить стили в единое место в коде, переиспользовать их, и импортировать там, где это необходимо.
+- Придерживайтесь единой цветовой гаммы при реализации всех панелей (в идеале) или, если не удаётся, панелей, отнесённых к одному прикладному участку (ПУДП, УЗСР, БУ, ПУП и т.п.).
+- Изучите и применяйте `ThemeProvider` из состава инструментов стилизации библиотеки [MUI](https://mui.com/) для придания индивидуальности панелям и их компонентам.
diff --git a/app/components/p8p_data_grid.js b/app/components/p8p_data_grid.js
index 7ccfd73..46c960e 100644
--- a/app/components/p8p_data_grid.js
+++ b/app/components/p8p_data_grid.js
@@ -35,6 +35,8 @@ const P8PDataGrid = ({
groups,
rows,
size,
+ fixedHeader = false,
+ fixedColumns = 0,
morePages = false,
reloading,
expandable,
@@ -48,6 +50,7 @@ const P8PDataGrid = ({
clearFilterBtnCaption,
cancelFilterBtnCaption,
morePagesBtnCaption,
+ morePagesBtnProps,
noDataFoundText,
headCellRender,
dataCellRender,
@@ -111,6 +114,8 @@ const P8PDataGrid = ({
orders={orders}
filters={filters}
size={size || P8P_DATA_GRID_SIZE.MEDIUM}
+ fixedHeader={fixedHeader}
+ fixedColumns={fixedColumns}
morePages={morePages}
reloading={reloading}
expandable={expandable}
@@ -133,6 +138,7 @@ const P8PDataGrid = ({
objectsCopier={objectsCopier}
containerComponent={containerComponent}
containerComponentProps={containerComponentProps}
+ morePagesBtnProps={morePagesBtnProps}
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
@@ -147,6 +153,8 @@ P8PDataGrid.propTypes = {
groups: PropTypes.array,
rows: PropTypes.array.isRequired,
size: PropTypes.string,
+ fixedHeader: PropTypes.bool,
+ fixedColumns: PropTypes.number,
morePages: PropTypes.bool,
reloading: PropTypes.bool.isRequired,
expandable: PropTypes.bool,
@@ -160,6 +168,7 @@ P8PDataGrid.propTypes = {
clearFilterBtnCaption: PropTypes.string.isRequired,
cancelFilterBtnCaption: PropTypes.string.isRequired,
morePagesBtnCaption: PropTypes.string.isRequired,
+ morePagesBtnProps: PropTypes.object,
noDataFoundText: PropTypes.string,
headCellRender: PropTypes.func,
dataCellRender: PropTypes.func,
diff --git a/app/components/p8p_gantt.js b/app/components/p8p_gantt.js
index 2f51fe8..6c562b2 100644
--- a/app/components/p8p_gantt.js
+++ b/app/components/p8p_gantt.js
@@ -66,7 +66,8 @@ const P8P_GANTT_TASK_SHAPE = PropTypes.shape({
//Структура динамического атрибута задачи
const P8P_GANTT_TASK_ATTRIBUTE_SHAPE = PropTypes.shape({
name: PropTypes.string.isRequired,
- caption: PropTypes.string.isRequired
+ caption: PropTypes.string.isRequired,
+ visible: PropTypes.bool.isRequired
});
//Структура описания цвета задачи
diff --git a/app/components/p8p_svg.js b/app/components/p8p_svg.js
new file mode 100644
index 0000000..2348b84
--- /dev/null
+++ b/app/components/p8p_svg.js
@@ -0,0 +1,193 @@
+/*
+ Парус 8 - Панели мониторинга
+ Компонент: Интерактивные изображения SVG
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useEffect, useRef, useState } from "react"; //Классы React
+import { IconButton, Icon, Container, Grid } from "@mui/material"; //Интерфейсные элементы
+import PropTypes from "prop-types"; //Контроль свойств компонента
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ GRID_ITEM_CANVAS: { width: "100%", height: "100%" },
+ CONTROLS: { justifyContent: "center", alignItems: "center", display: "flex" }
+};
+
+//Структура элемента изображения
+const P8P_SVG_ITEM_SHAPE = PropTypes.shape({
+ id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
+ title: PropTypes.any,
+ backgroundColor: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)])
+});
+
+//-----------
+//Тело модуля
+//-----------
+
+//Интерактивные изображения SVG
+const P8PSVG = ({ data, items, onClick, onItemClick, canvasStyle, fillOpacity }) => {
+ //Собственное состояние
+ const [state, setState] = useState({
+ images: [],
+ currentImage: 0,
+ imagesCount: 0
+ });
+
+ //Ссылки на DOM
+ const svgContainerRef = useRef(null);
+ const svgRef = useRef(null);
+
+ //Обработка нажатия на элемент изображения
+ const handleClick = e => {
+ let itemClickFired = false;
+ if (items && onItemClick) {
+ const item = items.find(item => item.id == e.target?.id || item.id == e.target?.parentElement?.id);
+ if (item) {
+ onItemClick({ item });
+ itemClickFired = true;
+ }
+ }
+ if (!itemClickFired && onClick) onClick(e);
+ };
+
+ //Формирование интерактивных элементов изображения
+ const makeSVGItems = () => {
+ items.forEach(item => {
+ const svgE = document.getElementById(item.id);
+ if (svgE) {
+ //Запомним старый стиль элемента
+ let styleOld = svgE.getAttribute("style") || "";
+ if (styleOld && !styleOld.endsWith(";")) styleOld = `${styleOld};`;
+ //Сформируем стиль для заливки
+ let fillStyle = "";
+ if (item.backgroundColor) fillStyle = `fill: ${item.backgroundColor}; ${fillOpacity ? `opacity: ${fillOpacity};` : ""}`;
+ //Сформируем стиль для курсора
+ let cursorStyle = "";
+ if (onItemClick) cursorStyle = "cursor: pointer;";
+ //Добавим элемент для всплывающей подсказки
+ let titleE = null;
+ if (item?.title) {
+ titleE = document.createElementNS("http://www.w3.org/2000/svg", "title");
+ titleE.textContent = item.title;
+ svgE.appendChild(titleE);
+ }
+ //Если нем попалась группа
+ if (svgE.tagName == "g") {
+ //Установим ей новые стили
+ svgE.setAttribute("style", `${styleOld}${cursorStyle}`);
+ //И заливку всем дочерним элементам
+ if (fillStyle)
+ for (const child of svgE.children) {
+ let childStyleOld = child.getAttribute("style") || "";
+ if (childStyleOld && !childStyleOld.endsWith(";")) childStyleOld = `${childStyleOld};`;
+ child.setAttribute("style", `${childStyleOld}${fillStyle}`);
+ }
+ } else {
+ //Это простой элемент, не группа - просто выставляем стили
+ svgE.setAttribute("style", `${styleOld}${cursorStyle}${fillStyle}`);
+ }
+ }
+ });
+ };
+
+ //Загрузка изображения
+ const loadSVG = () => {
+ const images = data
+ .split("")
+ .filter(i => i)
+ .map(i => i + "");
+ setState(pv => ({ ...pv, images, imagesCount: images.length, currentImage: 0 }));
+ };
+
+ //Отображение текущего изображения
+ const showSVG = () => {
+ if (state.imagesCount > 0) {
+ const parser = new DOMParser();
+ const doc = parser.parseFromString(state.images[state.currentImage], "image/svg+xml");
+ svgRef.current = doc.documentElement;
+ svgRef.current.onclick = handleClick;
+ svgContainerRef.current.replaceChildren(svgRef.current);
+ if (items) makeSVGItems(items);
+ }
+ };
+
+ //Переключение текущего изображения
+ const switchImage = direction => {
+ setState(pv => ({
+ ...pv,
+ currentImage:
+ direction > 0
+ ? pv.currentImage + 1 >= pv.imagesCount
+ ? 0
+ : pv.currentImage + 1
+ : pv.currentImage - 1 < 0
+ ? pv.imagesCount - 1
+ : pv.currentImage - 1
+ }));
+ };
+
+ //При обновлении данных
+ useEffect(() => {
+ loadSVG();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [data]);
+
+ //При загрузке изображения
+ useEffect(() => {
+ showSVG();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [state.images, state.currentImage, items]);
+
+ //При прокрутке изображений назад
+ const handlePrevClick = () => switchImage(1);
+
+ //При прокрутке изображений вперёд
+ const handleNextClick = () => switchImage(-1);
+
+ //Генерация содержимого
+ return (
+
+
+
+
+
+ {state.imagesCount > 1 ? (
+
+
+
+ arrow_left
+
+
+ arrow_right
+
+
+
+ ) : null}
+
+
+ );
+};
+
+//Контроль свойств - Интерактивные изображения SVG
+P8PSVG.propTypes = {
+ data: PropTypes.string.isRequired,
+ items: PropTypes.arrayOf(P8P_SVG_ITEM_SHAPE),
+ onClick: PropTypes.func,
+ onItemClick: PropTypes.func,
+ canvasStyle: PropTypes.object,
+ fillOpacity: PropTypes.string
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { P8PSVG };
diff --git a/app/components/p8p_table.js b/app/components/p8p_table.js
index b81947d..04490dc 100644
--- a/app/components/p8p_table.js
+++ b/app/components/p8p_table.js
@@ -33,6 +33,7 @@ import {
Container,
Link
} from "@mui/material"; //Интерфейсные компоненты
+import { useTheme } from "@mui/material/styles"; //Взаимодействие со стилями MUI
import { P8PAppInlineError } from "./p8p_app_message"; //Встраиваемое сообщение об ошибке
import { P8P_TABLE_AT, HEADER_INITIAL_STATE, hasValue, p8pTableReducer } from "./p8p_table_reducer"; //Редьюсер состояния
@@ -85,9 +86,30 @@ const STYLES = {
TABLE: {
with: "100%"
},
+ TABLE_HEAD_STICKY: {
+ position: "sticky",
+ top: 0,
+ zIndex: 1000
+ },
+ TABLE_HEAD_CELL_STICKY: (theme, left) => ({
+ position: "sticky",
+ left,
+ backgroundColor: theme.palette.background.default,
+ zIndex: 1000
+ }),
TABLE_ROW: {
"&:last-child td, &:last-child th": { border: 0 }
},
+ TABLE_CELL_STICKY: (theme, left) => ({
+ position: "sticky",
+ left,
+ backgroundColor: theme.palette.background.default,
+ zIndex: 500
+ }),
+ TABLE_CELL_EXPAND_CONTROL: {
+ minWidth: "60px",
+ maxWidth: "60px"
+ },
TABLE_CELL_EXPAND_CONTAINER: {
paddingBottom: 0,
paddingTop: 0
@@ -95,6 +117,10 @@ const STYLES = {
TABLE_CELL_GROUP_HEADER: {
backgroundColor: "lightgray"
},
+ TABLE_CELL_GROUP_HEADER_STICKY: {
+ position: "sticky",
+ left: 0
+ },
TABLE_COLUMN_STACK: {
alignItems: "center"
},
@@ -460,6 +486,8 @@ const P8PTable = ({
orders,
filters,
size,
+ fixedHeader = false,
+ fixedColumns = 0,
morePages = false,
reloading,
expandable,
@@ -473,6 +501,7 @@ const P8PTable = ({
clearFilterBtnCaption,
cancelFilterBtnCaption,
morePagesBtnCaption,
+ morePagesBtnProps,
noDataFoundText,
headCellRender,
dataCellRender,
@@ -501,6 +530,9 @@ const P8PTable = ({
//Собственное состояние - колонка с отображаемой подсказкой
const [displayHintColumn, setDisplayHintColumn] = useState(null);
+ //Стили
+ const theme = useTheme();
+
//Описание фильтруемой колонки
const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;
@@ -516,12 +548,12 @@ const P8PTable = ({
: ["", ""];
//Формирование заголовка таблицы
- const setHeader = ({ columnsDef, expandable, objectsCopier }) =>
- dispatchHeaderAction({ type: P8P_TABLE_AT.SET_HEADER, payload: { columnsDef, expandable, objectsCopier } });
+ const setHeader = ({ columnsDef, expandable, fixedColumns, objectsCopier }) =>
+ dispatchHeaderAction({ type: P8P_TABLE_AT.SET_HEADER, payload: { columnsDef, expandable, fixedColumns, objectsCopier } });
//Сворачивание/разворачивание уровня заголовка таблицы
const toggleHeaderExpand = ({ columnName, objectsCopier }) =>
- dispatchHeaderAction({ type: P8P_TABLE_AT.TOGGLE_HEADER_EXPAND, payload: { columnName, expandable, objectsCopier } });
+ dispatchHeaderAction({ type: P8P_TABLE_AT.TOGGLE_HEADER_EXPAND, payload: { columnName, expandable, fixedColumns, objectsCopier } });
//Выравнивание в зависимости от типа данных
const getAlignByDataType = ({ dataType, hasChild }) =>
@@ -621,38 +653,46 @@ const P8PTable = ({
//При изменении описания колонок
useEffect(() => {
- setHeader({ columnsDef, expandable, objectsCopier });
- }, [columnsDef, expandable, objectsCopier]);
+ setHeader({ columnsDef, expandable, fixedColumns, objectsCopier });
+ }, [columnsDef, expandable, fixedColumns, objectsCopier]);
//Генерация заголовка группы
const renderGroupCell = group => {
let customRender = {};
if (groupCellRender) customRender = groupCellRender({ columnsDef: header.columnsDef, group }) || {};
- return (
+ return header.displayDataColumns.map((columnDef, i) => (
-
- {group.expandable ? (
- {
- setExpandedGroups(pv => ({ ...pv, ...{ [group.name]: !pv[group.name] } }));
- }}
- >
- {expandedGroups[group.name] ? "indeterminate_check_box" : "add_box"}
-
- ) : null}
- {customRender.data ? customRender.data : group.caption}
-
+ {i == 0 ? (
+
+ {group.expandable ? (
+ {
+ setExpandedGroups(pv => ({ ...pv, ...{ [group.name]: !pv[group.name] } }));
+ }}
+ >
+ {expandedGroups[group.name] ? "indeterminate_check_box" : "add_box"}
+
+ ) : null}
+ {customRender.data ? customRender.data : group.caption}
+
+ ) : null}
- );
+ ));
};
//Генерация содержимого
return (
- <>
+
{displayHintColumn ? (
) : null}
@@ -684,13 +724,22 @@ const P8PTable = ({
valueFormatter={valueFormatter}
/>
) : null}
-
-
-
- {header.displayLevels.map(level => (
+
+
+ {header.displayLevels.map((level, i) => (
- {expandable && rowExpandRender ? : null}
+ {expandable && rowExpandRender && i == 0 ? (
+
+ ) : null}
{header.displayLevelsColumns[level].map((columnDef, j) => {
let customRender = {};
if (headCellRender) customRender = headCellRender({ columnDef }) || {};
@@ -698,7 +747,11 @@ const P8PTable = ({
- {rows.length > 0
- ? (Array.isArray(groups) && groups.length > 0 ? groups : [{}]).map((group, g) => {
- const rowsView = rows.map((row, i) =>
- !group?.name || group?.name == row.groupName ? (
-
-
- {expandable && rowExpandRender ? (
-
- handleExpandClick(i)}>
- {expanded[i] === true ? "keyboard_arrow_down" : "keyboard_arrow_right"}
-
-
- ) : null}
- {header.displayDataColumns.map((columnDef, j) => {
- let customRender = {};
- if (dataCellRender) customRender = dataCellRender({ row, columnDef }) || {};
- return (
-
- {customRender.data
- ? customRender.data
- : valueFormatter
- ? valueFormatter({ value: row[columnDef.name], columnDef })
- : row[columnDef.name]}
-
- );
- })}
-
- {expandable && rowExpandRender && expanded[i] === true ? (
-
-
- {rowExpandRender({ columnsDef, row })}
-
-
- ) : null}
-
- ) : null
- );
- return !group?.name ? (
- rowsView
- ) : (
-
- {renderGroupCell(group)}
- {!group.expandable || expandedGroups[group.name] === true ? rowsView : null}
-
- );
- })
- : null}
+ {rows.length > 0 ? (
+ (Array.isArray(groups) && groups.length > 0 ? groups : [{}]).map((group, g) => {
+ const rowsView = rows.map((row, i) =>
+ !group?.name || group?.name == row.groupName ? (
+
+
+ {expandable && rowExpandRender ? (
+
+ handleExpandClick(i)}>
+ {expanded[i] === true ? "keyboard_arrow_down" : "keyboard_arrow_right"}
+
+
+ ) : null}
+ {header.displayDataColumns.map((columnDef, j) => {
+ let customRender = {};
+ if (dataCellRender) customRender = dataCellRender({ row, columnDef }) || {};
+ return (
+
+ {customRender.data
+ ? customRender.data
+ : valueFormatter
+ ? valueFormatter({ value: row[columnDef.name], columnDef })
+ : row[columnDef.name]}
+
+ );
+ })}
+
+ {expandable && rowExpandRender && expanded[i] === true ? (
+
+
+ {rowExpandRender({ columnsDef, row })}
+
+
+ ) : null}
+
+ ) : null
+ );
+ return !group?.name ? (
+ rowsView
+ ) : (
+
+ {renderGroupCell(group)}
+ {!group.expandable || expandedGroups[group.name] === true ? rowsView : null}
+
+ );
+ })
+ ) : noDataFoundText && !reloading ? (
+
+
+
+
+
+ ) : null}
- {rows.length == 0 ? (
- noDataFoundText && !reloading ? (
-
- ) : null
- ) : morePages ? (
-
-
- {morePagesBtnCaption}
-
-
- ) : null}
- >
+ {morePages ? (
+
+
+ {morePagesBtnCaption}
+
+
+ ) : null}
+
);
};
@@ -829,7 +901,8 @@ P8PTable.propTypes = {
values: PropTypes.array,
parent: PropTypes.string,
expandable: PropTypes.bool.isRequired,
- expanded: PropTypes.bool.isRequired
+ expanded: PropTypes.bool.isRequired,
+ width: PropTypes.number
})
).isRequired,
groups: PropTypes.arrayOf(
@@ -849,6 +922,8 @@ P8PTable.propTypes = {
).isRequired,
filters: PropTypes.arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,
size: PropTypes.string,
+ fixedHeader: PropTypes.bool,
+ fixedColumns: PropTypes.number,
morePages: PropTypes.bool,
reloading: PropTypes.bool.isRequired,
expandable: PropTypes.bool,
@@ -862,6 +937,7 @@ P8PTable.propTypes = {
clearFilterBtnCaption: PropTypes.string.isRequired,
cancelFilterBtnCaption: PropTypes.string.isRequired,
morePagesBtnCaption: PropTypes.string.isRequired,
+ morePagesBtnProps: PropTypes.object,
noDataFoundText: PropTypes.string,
headCellRender: PropTypes.func,
dataCellRender: PropTypes.func,
diff --git a/app/components/p8p_table_reducer.js b/app/components/p8p_table_reducer.js
index 9dc4721..10e23be 100644
--- a/app/components/p8p_table_reducer.js
+++ b/app/components/p8p_table_reducer.js
@@ -19,7 +19,8 @@ const HEADER_INITIAL_STATE = () => ({
displayLevels: [],
displayLevelsColumns: {},
displayDataColumnsCount: 0,
- displayDataColumns: []
+ displayDataColumns: [],
+ displayFixedColumnsCount: 0
});
//Состояние описания ячейки заголовка таблицы по умолчанию
@@ -28,6 +29,8 @@ const HEADER_COLUMN_INITIAL_STATE = ({ columnDef, objectsCopier }) => {
if (!hasValue(tmp.parent)) tmp.parent = "";
if (!hasValue(tmp.expandable)) tmp.expandable = false;
if (!hasValue(tmp.expanded)) tmp.expanded = true;
+ if (!hasValue(tmp.fixed)) tmp.fixed = false;
+ if (!hasValue(tmp.fixedLeft)) tmp.fixedLeft = 0;
return tmp;
};
@@ -55,8 +58,23 @@ const getDisplayColumnColSpan = (displayTree, columnDef) => {
} else return 1;
};
+//Определения признака зафиксированности колонки
+const getFixedColumns = (displayTree, parentFixed, parentLeft, fixedColumns) => {
+ if (fixedColumns) {
+ let left = parentLeft;
+ displayTree.forEach((columnDef, i) => {
+ left += columnDef.width;
+ if ((columnDef.level == 1 && i + 1 <= fixedColumns) || (columnDef.level > 1 && parentFixed)) {
+ columnDef.fixed = true;
+ columnDef.fixedLeft = left - columnDef.width;
+ } else columnDef.fixed = false;
+ if (columnDef.hasChild) getFixedColumns(columnDef.child, columnDef.fixed, columnDef.fixedLeft, fixedColumns);
+ });
+ }
+};
+
//Формирование дерева отображаемых элементов заголовка
-const buildDisplayTree = (columnsDef, parent, level) => {
+const buildDisplayTree = (columnsDef, parent, level, expandable, fixedColumns) => {
const baseBuild = (columnsDef, parent, level) => {
let maxLevel = level - 1;
const res = columnsDef
@@ -77,6 +95,7 @@ const buildDisplayTree = (columnsDef, parent, level) => {
};
const [displayTree, maxLevel] = baseBuild(columnsDef, parent, level);
getDisplayColumnRowSpan(displayTree, maxLevel);
+ getFixedColumns(displayTree, false, expandable ? 60 : 0, fixedColumns);
return [displayTree, maxLevel];
};
@@ -106,35 +125,42 @@ const buildDisplayDataColumns = (displayTree, expandable) => {
return [displayDataColumns, displayDataColumns.length + (expandable === true ? 1 : 0)];
};
+//Подсчёт количества отображаемых фиксированных колонок
+const getDisplayFixedColumnsCount = displayTree => {
+ let res = 0;
+ const traverseTree = displayTree => {
+ displayTree.forEach(columnDef => (columnDef.hasChild ? traverseTree(columnDef.child) : columnDef.fixed ? res++ : null));
+ };
+ traverseTree(displayTree);
+ return res;
+};
+
//Формирование описания отображаемых колонок
-const buildDisplay = ({ columnsDef, expandable }) => {
+const buildDisplay = ({ columnsDef, expandable, fixedColumns }) => {
//Сформируем дерево отображаемых колонок заголовка
- const [displayTree, maxLevel] = buildDisplayTree(columnsDef, "", 1);
+ const [displayTree, maxLevel] = buildDisplayTree(columnsDef, "", 1, expandable, fixedColumns);
//Вытянем дерево в удобные для рендеринга структуры
const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);
//Сформируем отображаемые колонки данных
const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);
+ //Подсчитаем количество отображаемых фиксированных колонок
+ const displayFixedColumnsCount = getDisplayFixedColumnsCount(displayTree);
//Вернём результат
- return [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount];
+ return [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount, displayFixedColumnsCount];
};
//Формирование описания заголовка
-const buildHeaderDef = ({ columnsDef, expandable, objectsCopier }) => {
+const buildHeaderDef = ({ columnsDef, expandable, fixedColumns, objectsCopier }) => {
//Инициализируем результат
const res = HEADER_INITIAL_STATE();
//Инициализируем внутренне описание колонок и поместим его в результат
columnsDef.forEach(columnDef => res.columnsDef.push(HEADER_COLUMN_INITIAL_STATE({ columnDef, objectsCopier })));
//Добавим в результат сведения об отображаемых данных
- [res.displayLevels, res.displayLevelsColumns, res.displayDataColumns, res.displayDataColumnsCount] = buildDisplay({
+ [res.displayLevels, res.displayLevelsColumns, res.displayDataColumns, res.displayDataColumnsCount, res.displayFixedColumnsCount] = buildDisplay({
columnsDef: res.columnsDef,
- expandable
+ expandable,
+ fixedColumns
});
- //Сформируем дерево отображаемых колонок заголовка
- //const [displayTree, maxLevel] = buildDisplayTree(res.columnsDef, "", 1);
- //Вытянем дерево в удобные для рендеринга структуры
- //[res.displayLevels, res.displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);
- //Сформируем отображаемые колонки данных
- //[res.displayDataColumns, res.displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);
//Вернём результат
return res;
};
@@ -147,30 +173,29 @@ const buildHeaderDef = ({ columnsDef, expandable, objectsCopier }) => {
const handlers = {
//Формирование заголовка
[P8P_TABLE_AT.SET_HEADER]: (state, { payload }) => {
- const { columnsDef, expandable, objectsCopier } = payload;
+ const { columnsDef, expandable, fixedColumns, objectsCopier } = payload;
return {
...state,
- ...buildHeaderDef({ columnsDef, expandable, objectsCopier })
+ ...buildHeaderDef({ columnsDef, expandable, fixedColumns, objectsCopier })
};
},
[P8P_TABLE_AT.TOGGLE_HEADER_EXPAND]: (state, { payload }) => {
- const { columnName, expandable, objectsCopier } = payload;
+ const { columnName, expandable, fixedColumns, objectsCopier } = payload;
const columnsDef = objectsCopier(state.columnsDef);
columnsDef.forEach(columnDef => (columnDef.name == columnName ? (columnDef.expanded = !columnDef.expanded) : null));
- const [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount] = buildDisplay({
+ const [displayLevels, displayLevelsColumns, displayDataColumns, displayDataColumnsCount, displayFixedColumnsCount] = buildDisplay({
columnsDef,
- expandable
+ expandable,
+ fixedColumns
});
- //const [displayTree, maxLevel] = buildDisplayTree(columnsDef, "", 1);
- //const [displayLevels, displayLevelsColumns] = buildDisplayLevelsColumns(displayTree, maxLevel);
- //const [displayDataColumns, displayDataColumnsCount] = buildDisplayDataColumns(displayTree, expandable);
return {
...state,
columnsDef,
displayLevels,
displayLevelsColumns,
displayDataColumns,
- displayDataColumnsCount
+ displayDataColumnsCount,
+ displayFixedColumnsCount
};
},
//Обработчик по умолчанию
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/rrp_conf_editor/custom_dialog.js b/app/panels/rrp_conf_editor/custom_dialog.js
new file mode 100644
index 0000000..ec21389
--- /dev/null
+++ b/app/panels/rrp_conf_editor/custom_dialog.js
@@ -0,0 +1,155 @@
+/*
+ Кастомный Dialog
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Dialog, DialogTitle, IconButton, Icon, DialogContent, Typography, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты
+import { CustomFormControl } from "./custom_form_control"; //Кастомные строки ввода
+import { Statuses, STYLES } from "./layouts"; //Статусы и стили диалогового окна
+
+//-----------
+//Тело модуля
+//-----------
+
+const CustomDialog = props => {
+ const {
+ formOpen,
+ closeForm,
+ curStatus,
+ curCode,
+ curName,
+ curColCode,
+ curRowCode,
+ btnOkClick,
+ codeOnChange,
+ nameOnChange,
+ dictColumnClick,
+ dictRowClick
+ } = props;
+
+ //Формирование заголовка диалогового окна
+ const formTitle = () => {
+ switch (curStatus) {
+ case Statuses.CREATE:
+ return "Добавление раздела";
+ case Statuses.EDIT:
+ return "Исправление раздела";
+ case Statuses.DELETE:
+ return "Удаление раздела";
+ case Statuses.COLUMNROW_CREATE:
+ return "Добавление показателя раздела";
+ case Statuses.COLUMNROW_EDIT:
+ return "Исправление показателя раздела";
+ case Statuses.COLUMNROW_DELETE:
+ return "Удаление показателя раздела";
+ }
+ };
+
+ //Отрисовка диалогового окна
+ const renderSwitch = () => {
+ var btnText = "";
+ switch (curStatus) {
+ case Statuses.CREATE:
+ case Statuses.COLUMNROW_CREATE:
+ btnText = "Добавить";
+ break;
+ case Statuses.EDIT:
+ case Statuses.COLUMNROW_EDIT:
+ btnText = "Исправить";
+ break;
+ case Statuses.DELETE:
+ case Statuses.COLUMNROW_DELETE:
+ btnText = "Удалить";
+ break;
+ }
+ return (
+
+ {btnText}
+
+ );
+ };
+
+ return (
+
+ {formTitle()}
+ theme.palette.grey[500]
+ }}
+ >
+ close
+
+
+ {curStatus == Statuses.DELETE || curStatus == Statuses.COLUMNROW_DELETE ? (
+ curStatus == Statuses.DELETE ? (
+ Вы хотите удалить раздел {curName}?
+ ) : (
+ Вы хотите удалить показатель раздела {curName}?
+ )
+ ) : (
+
+ {curStatus != Statuses.COLUMNROW_EDIT ? (
+
+ ) : null}
+
+ {curStatus == Statuses.COLUMNROW_CREATE ? (
+
+
+
+
+ ) : null}
+
+ )}
+
+
+ {renderSwitch()}
+
+ Отмена
+
+
+
+ );
+};
+
+CustomDialog.propTypes = {
+ formOpen: PropTypes.bool.isRequired,
+ closeForm: PropTypes.func.isRequired,
+ curStatus: PropTypes.oneOf(Object.values(Statuses).filter(x => typeof x === "number")),
+ curCode: PropTypes.string,
+ curName: PropTypes.string,
+ curColCode: PropTypes.string,
+ curRowCode: PropTypes.string,
+ btnOkClick: PropTypes.func.isRequired,
+ codeOnChange: PropTypes.func.isRequired,
+ nameOnChange: PropTypes.func.isRequired,
+ dictColumnClick: PropTypes.func.isRequired,
+ dictRowClick: PropTypes.func.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CustomDialog };
diff --git a/app/panels/rrp_conf_editor/custom_form_control.js b/app/panels/rrp_conf_editor/custom_form_control.js
new file mode 100644
index 0000000..2e9cc01
--- /dev/null
+++ b/app/panels/rrp_conf_editor/custom_form_control.js
@@ -0,0 +1,58 @@
+/*
+ Кастомный FormControl
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Box, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, Icon } from "@mui/material"; //Интерфейсные компоненты
+import { STYLES } from "./layouts"; //Стили диалогового окна
+
+//-----------
+//Тело модуля
+//-----------
+
+const CustomFormControl = props => {
+ const { elementCode, elementValue, labelText, changeFunc, withDictionary, ...other } = props;
+
+ return (
+
+
+ {labelText}
+ changeFunc(e.target.value) : null}
+ aria-describedby={`${elementCode}-outlined-helper-text`}
+ label={labelText}
+ endAdornment={
+ withDictionary ? (
+
+
+ list
+
+
+ ) : null
+ }
+ />
+
+
+ );
+};
+
+CustomFormControl.propTypes = {
+ elementCode: PropTypes.string.isRequired,
+ elementValue: PropTypes.string,
+ labelText: PropTypes.string.isRequired,
+ changeFunc: PropTypes.func.isRequired,
+ withDictionary: PropTypes.bool
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CustomFormControl };
diff --git a/app/panels/rrp_conf_editor/custom_tab_panel.js b/app/panels/rrp_conf_editor/custom_tab_panel.js
new file mode 100644
index 0000000..083db8e
--- /dev/null
+++ b/app/panels/rrp_conf_editor/custom_tab_panel.js
@@ -0,0 +1,41 @@
+/*
+ Кастомный Tab
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Box, Typography } from "@mui/material"; //Интерфейсные компоненты
+
+//-----------
+//Тело модуля
+//-----------
+
+const CustomTabPanel = props => {
+ const { children, value, index, ...other } = props;
+
+ return (
+
+ {value === index && (
+
+ {children}
+
+ )}
+
+ );
+};
+
+CustomTabPanel.propTypes = {
+ children: PropTypes.node,
+ index: PropTypes.number.isRequired,
+ value: PropTypes.number.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CustomTabPanel };
diff --git a/app/panels/rrp_conf_editor/index.js b/app/panels/rrp_conf_editor/index.js
new file mode 100644
index 0000000..f1804e9
--- /dev/null
+++ b/app/panels/rrp_conf_editor/index.js
@@ -0,0 +1,16 @@
+/*
+ Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта
+ Панель мониторинга: Точка входа
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { RrpConfEditor } from "./rrp_conf_editor"; //Корневая панель выполнения работ
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export const RootClass = RrpConfEditor;
\ No newline at end of file
diff --git a/app/panels/rrp_conf_editor/layouts.js b/app/panels/rrp_conf_editor/layouts.js
new file mode 100644
index 0000000..7e968df
--- /dev/null
+++ b/app/panels/rrp_conf_editor/layouts.js
@@ -0,0 +1,46 @@
+/*
+ Парус 8 -
+ Дополнительная разметка и вёрстка клиентских элементов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import { Stack, IconButton, Icon, Typography } from "@mui/material"; //Интерфейсные компоненты
+
+//---------
+//Константы
+//---------
+
+export const STYLES = {
+ DIALOG_WINDOW_WIDTH: { width: 400 },
+ PADDING_DIALOG_BUTTONS_RIGHT: { paddingRight: "32px" }
+};
+
+//Статусы диалогового окна
+export const Statuses = { CREATE: 0, EDIT: 1, DELETE: 2, COLUMNROW_CREATE: 3, COLUMNROW_EDIT: 4, COLUMNROW_DELETE: 5 };
+
+//-----------
+//Тело модуля
+//-----------
+
+//Генерация представления ячейки c данными
+export const dataCellRender = ({ row, columnDef }, editCR, deleteCR) => {
+ let data = row[columnDef.name];
+ columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true
+ ? (data = (
+
+ {row[columnDef.name]}
+ editCR(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name])}>
+ edit
+
+ deleteCR(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name])}>
+ delete
+
+
+ ))
+ : null;
+ return { data };
+};
diff --git a/app/panels/rrp_conf_editor/rrp_conf_editor.js b/app/panels/rrp_conf_editor/rrp_conf_editor.js
new file mode 100644
index 0000000..3cdc7db
--- /dev/null
+++ b/app/panels/rrp_conf_editor/rrp_conf_editor.js
@@ -0,0 +1,481 @@
+/*
+ Парус 8 - Редактор настройки регламентированного отчёта
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useCallback, useContext, useState, useEffect } from "react"; //Классы React
+import { Box, Tab, Tabs, IconButton, Icon, Stack, 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 { NavigationCtx } from "../../context/navigation"; //Контекст навигации
+import { CustomTabPanel } from "./custom_tab_panel"; //Кастомный Tab
+import { ApplicationСtx } from "../../context/application"; //Контекст приложения
+import { Statuses, dataCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
+import { CustomDialog } from "./custom_dialog"; //Кастомное диалоговое окно
+
+//-----------
+//Тело модуля
+//-----------
+
+//Редактор настройки регламентированного отчёта
+const RrpConfEditor = () => {
+ const dataGrid = {
+ rn: 0,
+ code: "",
+ name: "",
+ dataLoaded: false,
+ columnsDef: [],
+ groups: [],
+ rows: [],
+ reload: false
+ };
+
+ //Собственное состояние
+ const [rrpDoc, setRrpDoc] = useState({
+ docLoaded: false,
+ sections: [],
+ reload: true
+ });
+
+ //Состояние массива данных разделов
+ const [dataGrids] = useState([]);
+
+ //Состояние раздела
+ const [tabValue, setTabValue] = useState("");
+
+ //Состояние открытия диалогового окна
+ const [formOpen, setForm] = useState(false);
+
+ //Состояние диалогового окна
+ const [formData, setFormData] = useState({
+ filled: false,
+ rn: "",
+ prn: "",
+ sctnName: "",
+ sctnCode: "",
+ status: "",
+ code: "",
+ name: "",
+ colName: "",
+ colCode: "",
+ colVCode: "",
+ colVRn: 0,
+ rowName: "",
+ rowCode: "",
+ rowVCode: "",
+ rowVRn: 0
+ });
+
+ //Открытие диалогового окна
+ const openForm = () => {
+ setForm(true);
+ };
+
+ //Закрытие диалогового окна
+ const closeForm = () => {
+ setForm(false);
+ };
+
+ //Очистка диалогового окна
+ const clearFormData = () => {
+ setFormData({
+ rn: "",
+ code: "",
+ name: ""
+ });
+ };
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Подключение к контексту приложения
+ const { pOnlineShowDictionary } = useContext(ApplicationСtx);
+
+ //Подключение к контексту навигации
+ const { getNavigationSearch } = useContext(NavigationCtx);
+
+ //Переключение раздела
+ const handleChange = (event, newValue) => {
+ setTabValue(newValue);
+ };
+
+ //Отработка нажатия на кнопку добавления секции
+ const addSectionClick = () => {
+ setFormData({ status: Statuses.CREATE, prn: Number(getNavigationSearch().NRN) });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку исправления секции
+ const editSectionClick = (rn, code, name) => {
+ setFormData({ rn: rn, code: code, name: name, status: Statuses.EDIT });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку удаления секции
+ const deleteSectionClick = (rn, code, name) => {
+ setFormData({ rn: rn, code: code, name: name, status: Statuses.DELETE });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку добавления показателя раздела
+ const addColumnRowClick = (prn, sctnCode, sctnName) => {
+ setFormData({ status: Statuses.COLUMNROW_CREATE, prn: prn, sctnCode: sctnCode, sctnName: sctnName });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку исправления показателя раздела
+ const editColumnRowClick = (rn, name) => {
+ setFormData({ status: Statuses.COLUMNROW_EDIT, rn: rn, name: name });
+ openForm();
+ };
+
+ //Отработка нажатия на кнопку удаления показателя раздела
+ const deleteColumnRowClick = (rn, name) => {
+ setFormData({ status: Statuses.COLUMNROW_DELETE, rn: rn, name: name });
+ openForm();
+ };
+
+ //Отработка нажатия на словарь граф
+ const dictColumnClick = () => {
+ pOnlineShowDictionary({
+ unitCode: "RRPColumn",
+ callBack: res =>
+ res.success === true
+ ? setFormData(pv => ({
+ ...pv,
+ colCode: res.outParameters.out_CODE,
+ colVCode: res.outParameters.out_RRPVERSION_CODE,
+ colVRn: res.outParameters.out_RRPVERSION
+ }))
+ : null
+ });
+ };
+
+ //Отработка нажатия на словарь строк
+ const dictRowClick = () => {
+ pOnlineShowDictionary({
+ unitCode: "RRPRow",
+ callBack: res =>
+ res.success === true
+ ? setFormData(pv => ({
+ ...pv,
+ rowCode: res.outParameters.out_CODE,
+ rowVCode: res.outParameters.out_RRPVERSION_CODE,
+ rowVRn: res.outParameters.out_RRPVERSION
+ }))
+ : null
+ });
+ };
+
+ //Нажатие на кнопку подтверждения создания/исправления/удаления на форме
+ const formBtnOkClick = () => {
+ let formStateProps = {};
+ if (formData.status === (Statuses.CREATE || Statuses.EDIT || Statuses.COLUMNROW_CREATE))
+ formStateProps = { ...formStateProps, code: document.querySelector("#code-outlined").value };
+ if (formData.status === (Statuses.CREATE || Statuses.EDIT || Statuses.COLUMNROW_CREATE || Statuses.COLUMNROW_EDIT))
+ formStateProps = { ...formStateProps, name: document.querySelector("#name-outlined").value };
+ setFormData(pv => ({
+ ...pv,
+ ...formStateProps,
+ filled: true
+ }));
+ closeForm();
+ };
+
+ //Формирование разделов
+ const a11yProps = index => {
+ return {
+ id: `simple-tab-${index}`,
+ "aria-controls": `simple-tabpanel-${index}`
+ };
+ };
+
+ //Отработка изменений в разделе или показателе раздела
+ const changeSections = useCallback(async () => {
+ if (formData.filled) {
+ switch (formData.status) {
+ case Statuses.CREATE:
+ insertSections();
+ clearFormData();
+ break;
+ case Statuses.EDIT:
+ updateSections();
+ clearFormData();
+ break;
+ case Statuses.DELETE:
+ deleteSections();
+ clearFormData();
+ break;
+ case Statuses.COLUMNROW_CREATE:
+ addColumnRow();
+ clearFormData();
+ break;
+ case Statuses.COLUMNROW_EDIT:
+ editColumnRow();
+ clearFormData();
+ break;
+ case Statuses.COLUMNROW_DELETE:
+ deleteColumnRow();
+ clearFormData();
+ break;
+ }
+ setRrpDoc(pv => ({ ...pv, reload: true }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [formData]);
+
+ //Добавление раздела
+ const insertSections = useCallback(async () => {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.INSERT_RRPCONF_SECTIONS",
+ args: {
+ NPRN: formData.prn,
+ SCODE: formData.code,
+ SNAME: formData.name
+ }
+ });
+ setFormData(pv => ({
+ ...pv,
+ rn: Number(data.NRN)
+ }));
+ }, [formData.prn, formData.code, formData.name, executeStored]);
+
+ //Исправление раздела
+ const updateSections = useCallback(async () => {
+ await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.UPDATE_RRPCONF_SECTIONS",
+ args: {
+ NRN: formData.rn,
+ SCODE: formData.code,
+ SNAME: formData.name
+ }
+ });
+ }, [formData.name, formData.code, formData.rn, executeStored]);
+
+ //Удаление раздела
+ const deleteSections = useCallback(async () => {
+ await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.DELETE_RRPCONF_SECTIONS",
+ args: {
+ NRN: formData.rn
+ }
+ });
+ }, [formData.rn, executeStored]);
+
+ //Добавление показателя раздела
+ const addColumnRow = useCallback(async () => {
+ await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.INSERT_RRPCONF_COLUMNROW",
+ args: {
+ NPRN: formData.prn,
+ SCODE: formData.code,
+ SNAME: formData.name,
+ SCOLCODE: formData.colCode,
+ SCOLVER: formData.colVCode,
+ SROWCODE: formData.rowCode,
+ SROWVER: formData.rowVCode
+ }
+ });
+ }, [executeStored, formData.code, formData.colVCode, formData.colCode, formData.name, formData.prn, formData.rowCode, formData.rowVCode]);
+
+ //Исправление показателя раздела
+ const editColumnRow = useCallback(async () => {
+ await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.UPDATE_RRPCONF_COLUMNROW",
+ args: { NRN: formData.rn, SNAME: formData.name }
+ });
+ }, [executeStored, formData.name, formData.rn]);
+
+ //Удаление показателя раздела
+ const deleteColumnRow = useCallback(async () => {
+ await executeStored({ stored: "PKG_P8PANELS_RRPCONFED.DELETE_RRPCONF_COLUMNROW", args: { NRN: formData.rn } });
+ }, [executeStored, formData.rn]);
+
+ //Получение мнемокода и наименования показателя раздела
+ const getSctnMrkCodeName = useCallback(async () => {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.GET_RRPCONFSCTNMRK_CODE_NAME",
+ args: { SSCTNCODE: formData.sctnCode, SROWCODE: formData.rowCode, SCOLUMNCODE: formData.colCode }
+ });
+ setFormData(pv => ({
+ ...pv,
+ code: data.SCODE,
+ name: data.SNAME
+ }));
+ }, [executeStored, formData.colCode, formData.rowCode, formData.sctnCode]);
+
+ //Загрузка данных разделов регламентированного отчёта
+ const loadData = useCallback(async () => {
+ if (rrpDoc.reload) {
+ //Переменная номера раздела с фокусом
+ let tabFocus = 0;
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_RRPCONFED.GET_RRPCONF_SECTIONS",
+ args: {
+ NRN_RRPCONF: Number(getNavigationSearch().NRN)
+ },
+ respArg: "COUT"
+ });
+ //Флаг первой загрузки данных
+ let firstLoad = dataGrids.length == 0 ? true : false;
+ //Копирование массива уже загруженных разделов
+ let cloneDGs = dataGrids.slice();
+ //Массив из нескольких разделов и из одного
+ const sections = data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS];
+ //Заполнение очередного раздела по шаблону
+ sections.map(s => {
+ let dg = {};
+ Object.assign(dg, dataGrid, {
+ rn: s.NRN,
+ code: s.SCODE,
+ name: s.SNAME,
+ dataLoaded: true,
+ columnsDef: [...(s.XDATA.XCOLUMNS_DEF || [])],
+ groups: [...(s.XDATA.XGROUPS || [])],
+ rows: [...(s.XDATA.XROWS || [])],
+ reload: false
+ });
+ //Ищем загружен ли уже раздел с таким же ид.
+ const dgItem = dataGrids.find(x => x.rn === dg.rn);
+ //Его индекс, если нет соответствия, то -1
+ let index = dataGrids.indexOf(dgItem);
+ //Если было соответствие
+ if (dgItem) {
+ //Если в нём не найдено изменений
+ if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {
+ //То из копированного массива его удаляем
+ cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);
+ } else {
+ //Иначе обновляем раздел в массиве
+ dataGrids[index] = dg;
+ //Удаляем из копированного массива
+ cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);
+ //Устанавливаем фокус на обновлённый раздел
+ tabFocus = index;
+ }
+ } else {
+ //Если раздел новый, то добавляем его в массив данных
+ dataGrids.push(dg);
+ //И устанавливаем на него фокус, если флаг первой загрузки = false
+ tabFocus = !firstLoad ? dataGrids.length - 1 : 0;
+ }
+ });
+ //Обходим разделы, что остались в копированном массиве (на удаление)
+ cloneDGs.map(s => {
+ let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));
+ //Устаревший раздел удаляем из массива данных
+ dataGrids.splice(curIndex, 1);
+ //Фокус на предшествующий раздел
+ tabFocus = curIndex - 1;
+ });
+ setRrpDoc(pv => ({
+ ...pv,
+ docLoaded: true,
+ reload: false,
+ sections: dataGrids
+ }));
+ setTabValue(tabFocus);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [rrpDoc.reload, rrpDoc.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [rrpDoc.reload, dataGrid.reload, loadData]);
+
+ //Обновление при изменении разделов
+ useEffect(() => {
+ changeSections();
+ }, [changeSections]);
+
+ //Получение наименования и мнемокода показателя раздела при заполнении необходимых полей
+ useEffect(() => {
+ formData.status == Statuses.COLUMNROW_CREATE && formData.sctnName && formData.sctnCode && formData.colCode && formData.rowCode
+ ? getSctnMrkCodeName()
+ : null;
+ }, [formData.colCode, formData.rowCode, formData.sctnCode, formData.sctnName, formData.status, getSctnMrkCodeName]);
+
+ //Генерация содержимого
+ return (
+
+ {formOpen ? (
+ setFormData(pv => ({ ...pv, code: v }))}
+ nameOnChange={v => setFormData(pv => ({ ...pv, name: v }))}
+ dictColumnClick={dictColumnClick}
+ dictRowClick={dictRowClick}
+ />
+ ) : null}
+ {rrpDoc.docLoaded ? (
+
+
+
+ {rrpDoc.sections.map((s, i) => {
+ return (
+
+ {s.name}
+ editSectionClick(s.rn, s.code, s.name)}>
+ edit
+
+ deleteSectionClick(s.rn, s.code, s.name)}>
+ delete
+
+
+ }
+ wrapped
+ />
+ );
+ })}
+
+
+ add
+
+
+ {rrpDoc.sections.map((s, i) => {
+ return (
+
+ addColumnRowClick(s.rn, s.code, s.name)}>
+ + Добавить
+
+ {s.dataLoaded ? (
+ dataCellRender({ ...prms }, editColumnRowClick, deleteColumnRowClick)}
+ />
+ ) : null}
+
+ );
+ })}
+
+ ) : null}
+
+ );
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { RrpConfEditor };
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_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_RRPCONFED.pck b/db/PKG_P8PANELS_RRPCONFED.pck
new file mode 100644
index 0000000..74be876
--- /dev/null
+++ b/db/PKG_P8PANELS_RRPCONFED.pck
@@ -0,0 +1,435 @@
+create or replace package PKG_P8PANELS_RRPCONFED as
+
+ /* Добавление раздела регламентированного отчёта */
+ procedure INSERT_RRPCONF_SECTIONS
+ (
+ NPRN in number, -- Ид. настройки форм регламентированного отчёта
+ SCODE in varchar2, -- Мнемокод
+ SNAME in varchar2, -- Наименование
+ NRN out number -- Ид. созданной записи
+ );
+
+ /* Исправление раздела регламентированного отчёта */
+ procedure UPDATE_RRPCONF_SECTIONS
+ (
+ NRN in number, -- Ид. раздела
+ SCODE in varchar2, -- Мнемокод раздела
+ SNAME in varchar2 -- Наименование раздела
+ );
+
+ /* Удаление раздела регламентированного отчёта */
+ procedure DELETE_RRPCONF_SECTIONS
+ (
+ NRN in number -- Ид. раздела
+ );
+
+ /* Добавление показателя раздела регламентированного отчёта */
+ procedure INSERT_RRPCONF_COLUMNROW
+ (
+ NPRN in number, -- Ид. раздела
+ SCODE in varchar2, -- Мнемокод показателя раздела
+ SNAME in varchar2, -- Наименование показателя раздела
+ SCOLCODE in varchar2, -- Мнемокод графы
+ SCOLVER in varchar2, -- Мнемокод редакции графы
+ SROWCODE in varchar2, -- Мнемокод строки
+ SROWVER in varchar2, -- Мнемокод редакции строки
+ NRN out number -- Ид. созданной записи
+ );
+
+ /* Исправление показателя раздела регламентированного отчёта */
+ procedure UPDATE_RRPCONF_COLUMNROW
+ (
+ NRN in number, -- Ид. показателя раздела
+ SNAME in varchar2 -- Новое наименование
+ );
+
+ /* Удаление показателя раздела регламентированного отчёта */
+ procedure DELETE_RRPCONF_COLUMNROW
+ (
+ NRN in number -- Ид. показателя раздела
+ );
+
+ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
+ procedure GET_RRPCONFSCTNMRK_CODE_NAME
+ (
+ SSCTNCODE in varchar2, -- Мнемокод раздела
+ SROWCODE in varchar2, -- Мнемокод строки
+ SCOLUMNCODE in varchar2, -- Мнемокод графы
+ SCODE out varchar2, -- Мнемокод показателя раздела
+ SNAME out varchar2 -- Наименование показателя раздела
+ );
+
+ /* Получение разделов регламентированного отчёта */
+ procedure GET_RRPCONF_SECTIONS
+ (
+ NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта
+ COUT out clob -- Список разделов
+ );
+
+end PKG_P8PANELS_RRPCONFED;
+/
+create or replace package body PKG_P8PANELS_RRPCONFED as
+
+ /* Добавление раздела регламентированного отчёта */
+ procedure INSERT_RRPCONF_SECTIONS
+ (
+ NPRN in number, -- Ид. настройки форм регламентированного отчёта
+ SCODE in varchar2, -- Мнемокод
+ SNAME in varchar2, -- Наименование
+ NRN out number -- Ид. созданной записи
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ begin
+ P_RRPCONFSCTN_INSERT(NCOMPANY => NCOMPANY,
+ NPRN => NPRN,
+ SCODE => SCODE,
+ SNAME => SNAME,
+ SRRPCONFSCTN => null,
+ SRRPPRMGRP => null,
+ SNOTE => null,
+ NHTML_HIDE => 0,
+ NHTML_HIDE_NAME_COL => 0,
+ NHTML_MAKE_HIER_GRP => 0,
+ SCLSF_CODE => null,
+ NLINKS_UPDATE => 0,
+ NDUP_RN => null,
+ NRN => NRN);
+ end INSERT_RRPCONF_SECTIONS;
+
+ /* Исправление раздела регламентированного отчёта */
+ procedure UPDATE_RRPCONF_SECTIONS
+ (
+ NRN in number, -- Ид. раздела
+ SCODE in varchar2, -- Мнемокод раздела
+ SNAME in varchar2 -- Наименование раздела
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ begin
+ P_RRPCONFSCTN_UPDATE(NRN => NRN,
+ NCOMPANY => NCOMPANY,
+ SCODE => SCODE,
+ SNAME => SNAME,
+ SRRPCONFSCTN => null,
+ SRRPPRMGRP => null,
+ SNOTE => null,
+ NHTML_HIDE => 0,
+ NHTML_HIDE_NAME_COL => 0,
+ NHTML_MAKE_HIER_GRP => 0,
+ SCLSF_CODE => null,
+ NFORMULA_UPDATE => 0,
+ NMARK_UPDATE => 0);
+ end UPDATE_RRPCONF_SECTIONS;
+
+ /* Удаление раздела регламентированного отчёта */
+ procedure DELETE_RRPCONF_SECTIONS
+ (
+ NRN in number -- Ид. раздела
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ begin
+ P_RRPCONFSCTN_DELETE(NRN => NRN, NCOMPANY => NCOMPANY);
+ end DELETE_RRPCONF_SECTIONS;
+
+ /* Добавление показателя раздела регламентированного отчёта */
+ procedure INSERT_RRPCONF_COLUMNROW
+ (
+ NPRN in number, -- Ид. раздела
+ SCODE in varchar2, -- Мнемокод показателя раздела
+ SNAME in varchar2, -- Наименование показателя раздела
+ SCOLCODE in varchar2, -- Мнемокод графы
+ SCOLVER in varchar2, -- Мнемокод редакции графы
+ SROWCODE in varchar2, -- Мнемокод строки
+ SROWVER in varchar2, -- Мнемокод редакции строки
+ NRN out number -- Ид. созданной записи
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ NCOUNT PKG_STD.TNUMBER; -- Счётчик показателей раздела
+ begin
+ select count(*) into NCOUNT from RRPCONFSCTNMRK T where T.PRN = NPRN;
+ P_RRPCONFSCTNMRK_INSERT(NCOMPANY => NCOMPANY,
+ NPRN => NPRN,
+ NNUMB => NCOUNT + 1,
+ SCODE => SCODE,
+ SNAME => SNAME,
+ SRRPROW => SROWCODE,
+ SRRPVERSION_ROW => SROWVER,
+ SRRPCOLUMN => SCOLCODE,
+ SRRPVERSION_COLUMN => SCOLVER,
+ SPKG_ROW => null,
+ SPRC_ROW => null,
+ SPKG_COL => null,
+ SPRC_COL => null,
+ SRRPPRM => null,
+ NIGNORE_ZOOM => 0,
+ NIGNORE_SHARP => 0,
+ SCLSF_CODE => null,
+ SNOTE => null,
+ NDUP_RN => null,
+ NRN => NRN);
+ end INSERT_RRPCONF_COLUMNROW;
+
+ /* Исправление показателя раздела регламентированного отчёта */
+ procedure UPDATE_RRPCONF_COLUMNROW
+ (
+ NRN in number, -- Ид. показателя раздела
+ SNAME in varchar2 -- Новое наименование
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ NNUMB PKG_STD.TNUMBER; -- Номер показателя раздела
+ SCODE PKG_STD.TSTRING; -- Мнемокод показателя раздела
+ SCOLCODE PKG_STD.TSTRING; -- Мнемокод графы
+ SCOLVER PKG_STD.TSTRING; -- Мнемокод редакции графы
+ SROWCODE PKG_STD.TSTRING; -- Мнемокод строки
+ SROWVER PKG_STD.TSTRING; -- Мнемокод редакции строки
+ begin
+ select T.NUMB,
+ T.CODE,
+ R.CODE,
+ RVER.CODE,
+ C.CODE,
+ CVER.CODE
+ into NNUMB,
+ SCODE,
+ SROWCODE,
+ SROWVER,
+ SCOLCODE,
+ SCOLVER
+ from RRPCONFSCTNMRK T,
+ RRPCOLUMN C,
+ RRPVERSION CVER,
+ RRPROW R,
+ RRPVERSION RVER
+ where T.RN = NRN
+ and T.RRPROW = R.RN(+)
+ and R.RRPVERSION = RVER.RN(+)
+ and T.RRPCOLUMN = C.RN(+)
+ and C.RRPVERSION = CVER.RN(+);
+ P_RRPCONFSCTNMRK_UPDATE(NRN => NRN,
+ NCOMPANY => NCOMPANY,
+ NNUMB => NNUMB,
+ SCODE => SCODE,
+ SNAME => SNAME,
+ SRRPROW => SROWCODE,
+ SRRPVERSION_ROW => SROWVER,
+ SRRPCOLUMN => SCOLCODE,
+ SRRPVERSION_COLUMN => SCOLVER,
+ SPKG_ROW => null,
+ SPRC_ROW => null,
+ SPKG_COL => null,
+ SPRC_COL => null,
+ SRRPPRM => null,
+ NIGNORE_ZOOM => 0,
+ NIGNORE_SHARP => 0,
+ SCLSF_CODE => null,
+ NFORMULA_UPDATE => 0,
+ SNOTE => null);
+ end UPDATE_RRPCONF_COLUMNROW;
+
+ /* Удаление показателя раздела регламентированного отчёта */
+ procedure DELETE_RRPCONF_COLUMNROW
+ (
+ NRN in number -- Ид. показателя раздела
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ begin
+ P_RRPCONFSCTNMRK_DELETE(NCOMPANY => NCOMPANY, NRN => NRN);
+ end DELETE_RRPCONF_COLUMNROW;
+
+ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
+ procedure GET_RRPCONFSCTNMRK_CODE_NAME
+ (
+ SSCTNCODE in varchar2, -- Мнемокод раздела
+ SROWCODE in varchar2, -- Мнемокод строки
+ SCOLUMNCODE in varchar2, -- Мнемокод графы
+ SCODE out varchar2, -- Мнемокод показателя раздела
+ SNAME out varchar2 -- Наименование показателя раздела
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
+ NROWRN PKG_STD.TREF; -- Ид. строки
+ NCOLUMNRN PKG_STD.TREF; -- Ид. графы
+ begin
+ P_RRPCONFSCTNMRK_MAKE_CODE(SRRPCONFSCTN => SSCTNCODE,
+ SRRPROW => SROWCODE,
+ SRRPCOLUMN => SCOLUMNCODE,
+ SCODE => SCODE);
+ select R.RN into NROWRN from RRPROW R where R.CODE = SROWCODE;
+ select C.RN into NCOLUMNRN from RRPCOLUMN C where C.CODE = SCOLUMNCODE;
+ P_RRPCONFSCTNMRK_MAKE_NAME(NCOMPANY => NCOMPANY,
+ NRRPROW => NROWRN,
+ NRRPCOLUMN => NCOLUMNRN,
+ NCHANGE_NAME => 1,
+ NCHANGE_NAME_PARENT => 0,
+ SNAME => SNAME);
+ end GET_RRPCONFSCTNMRK_CODE_NAME;
+
+ /* Получение разделов регламентированного отчёта */
+ procedure GET_RRPCONF_SECTIONS
+ (
+ NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта
+ COUT out clob -- Список разделов
+ )
+ is
+ NVERSION PKG_STD.TREF; -- Рег. номер версии словаря контрагентов
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ CDG clob; -- XML данных раздела
+ CCURCLOB clob; -- XML текущего раздела
+ NCURRN PKG_STD.TREF; -- Ид. текущего раздела
+ SCURCODE PKG_STD.TSTRING; -- Мнемокод текущего раздела
+ SCURNAME PKG_STD.TSTRING; -- Наименование текущего раздела
+ SCUR_ROW PKG_STD.TSTRING := 'default'; -- Текущая строка таблицы
+ CXML PKG_CONTVALLOC2NS.TCONTAINER; -- Контейнер для данных XML
+
+ /* Курсор с отбором показателей раздела по ид. раздела */
+ cursor C1 (NSCTN_RN in number) is
+ select T.RN NRN,
+ T.PRN NPRN,
+ T.RRPCONF NRRPCONF,
+ T.RRPPRM NRRPPRM,
+ T.CODE SCODE,
+ T.NAME SNAME,
+ R.CODE SROW_CODE,
+ R.NAME SROW_NAME,
+ C.CODE SCOLUMN_CODE,
+ C.NAME SCOLUMN_NAME
+ from RRPCONFSCTNMRK T,
+ RRPROW R,
+ RRPCOLUMN C
+ where T.PRN in (select T2.RN
+ from RRPCONFSCTN T2
+ where T2.PRN = NRN_RRPCONF
+ and T2.VERSION = NVERSION)
+ and T.VERSION = NVERSION
+ and T.RRPROW = R.RN (+)
+ and T.RRPCOLUMN = C.RN (+)
+ and T.PRN = NSCTN_RN
+ order by T.CODE;
+
+ /* Курсор с отбором граф раздела по ид. раздела */
+ cursor CN (NSCTN_RN in number) is
+ select distinct(C.CODE) SCOLUMN_CODE,
+ C.NAME SCOLUMN_NAME
+ from RRPCONFSCTNMRK T,
+ RRPCOLUMN C
+ where T.PRN in (select T2.RN
+ from RRPCONFSCTN T2
+ where T2.PRN = NRN_RRPCONF
+ and T2.VERSION = NVERSION)
+ and T.VERSION = NVERSION
+ and T.RRPCOLUMN = C.RN (+)
+ and T.PRN = NSCTN_RN
+ order by SCOLUMN_CODE;
+ begin
+ /* Очистка контейнера */
+ PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML);
+ /* Определение версии раздела */
+ NVERSION := GET_SESSION_VERSION(SUNITCODE => 'RRPConfig');
+ /* Цикл по разделам настройки форм регламентированного отчёта */
+ for C in (select T.RN NRN,
+ T.VERSION NVERSION,
+ T.CRN NCRN,
+ T.PRN NPRN,
+ T.CODE SCODE,
+ T.NAME SNAME
+ from RRPCONFSCTN T
+ where T.PRN = NRN_RRPCONF
+ and T.VERSION = NVERSION)
+ loop
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Формируем структуру заголовка */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SROW_NAME',
+ SCAPTION => 'Наименование строки',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
+ /* Цикл формирования колонок с графами */
+ for CL in CN(C.NRN)
+ loop
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SCOL_' || CL.SCOLUMN_CODE,
+ SCAPTION => CL.SCOLUMN_NAME,
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN_' || CL.SCOLUMN_CODE,
+ SCAPTION => CL.SCOLUMN_NAME || ' Идентификаторы',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ end loop;
+ /* Для нового раздела очищаем переменную кода строки */
+ SCUR_ROW := 'default';
+ /* Инициализируем строку */
+ RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE();
+ /* Цикл заполнения строк данными о показателях раздела */
+ for CR in C1(C.NRN)
+ loop
+ /* Если новая строка */
+ if (SCUR_ROW != CR.SROW_CODE) then
+ /* Если строка не первая */
+ if (SCUR_ROW != 'default') then
+ /* Добавим строку для раздела */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ /* Инициализируем новую строку */
+ RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE();
+ end if;
+ /* Запоминаем мнемокод новой строки */
+ SCUR_ROW := CR.SROW_CODE;
+ /* Заполняем наименование строки */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => CR.SROW_NAME);
+ end if;
+ /* Заполняем наименование показателя раздела */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || CR.SCOLUMN_CODE, SVALUE => CR.SNAME);
+ /* Заполняем ид. показателя раздела */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN_' || CR.SCOLUMN_CODE, NVALUE => CR.NRN);
+ end loop;
+ /* Добавим последнюю строку для раздела */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ /* Сериализуем описание */
+ CDG := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
+ /* Заполняем контейнер данными о разделе */
+ PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_CODE', SVALUE => C.SCODE);
+ PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_NAME', SVALUE => C.SNAME);
+ PKG_CONTVALLOC2NS.PUTLC(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_CLOB', LCVALUE => CDG);
+ end loop;
+ /* Формируем XML с данными */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
+ /* Цикл по контейнеру с данными о разделах */
+ for X in 1 .. PKG_CONTVALLOC2NS.COUNT_(RCONTAINER => CXML)
+ loop
+ /* Ид. раздела */
+ if (X = 1) then
+ NCURRN := PKG_CONTVALLOC2NS.FIRST_(RCONTAINER => CXML);
+ else
+ NCURRN := PKG_CONTVALLOC2NS.NEXT_(RCONTAINER => CXML, NTABID => NCURRN);
+ end if;
+ /* Мнемокод раздела */
+ SCURCODE := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_CODE');
+ /* Наименование раздела */
+ SCURNAME := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_NAME');
+ /* Clob с показателями раздела */
+ CCURCLOB := PKG_CONTVALLOC2NS.GETLC(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_CLOB');
+ /* Формирование элемента XML с данными о разделе */
+ PKG_XFAST.DOWN_NODE(SNAME => 'SECTIONS');
+ PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => NCURRN);
+ PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => SCURCODE);
+ PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => SCURNAME);
+ PKG_XFAST.VALUE_XML(LCVALUE => CCURCLOB);
+ PKG_XFAST.UP();
+ end loop;
+ PKG_XFAST.UP();
+ /* Сериализуем описание */
+ COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
+ PKG_XFAST.EPILOGUE();
+ /* Очистка контейнера */
+ PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML);
+ end GET_RRPCONF_SECTIONS;
+
+end PKG_P8PANELS_RRPCONFED;
+/
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/db/grants.sql b/db/grants.sql
index 695a5a6..c12f082 100644
--- a/db/grants.sql
+++ b/db/grants.sql
@@ -2,3 +2,4 @@ grant execute on PKG_P8PANELS to public;
grant execute on PKG_P8PANELS_PROJECTS to public;
grant execute on PKG_P8PANELS_SAMPLES to public;
grant execute on PKG_P8PANELS_EQUIPSRV to public;
+grant execute on PKG_P8PANELS_RRPCONFED to public;
\ No newline at end of file
diff --git a/dist/p8-panels.js b/dist/p8-panels.js
index d7cd438..b137e7f 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/fcroutlstord\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstord.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.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\"./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 ***!
@@ -2120,6 +2263,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 +2318,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 +2494,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 +2648,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 +2670,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 +2780,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 ***!
@@ -3304,7 +3557,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ 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 +3579,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 +3594,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 +3612,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 +3623,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 +3766,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 +3788,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 +4019,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_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.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/Box/Box.js\");\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/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.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/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 _fcroutlstord__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fcroutlstord */ \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_6__ = __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 Компонент панели: Таблица маршрутных листов\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 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_EDITOR: {\n maxWidth: \"250px\"\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_7__[\"default\"], {\n elevation: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcroutlstord__WEBPACK_IMPORTED_MODULE_5__.CostRouteListsOrdDataGrid, {\n mainRowRN: row.NRN\n }));\n};\n\n//Форматирование значений колонок\nconst dataCellRender = ({\n row,\n columnDef /*, handlePriorEditOpen, handleOrderEditOpen */\n}) => {\n //!!! Пока отключено - не удалять\n // switch (columnDef.name) {\n // case \"NPRIOR_PARTY\":\n // return {\n // data: (\n // <>\n // {row[\"NPRIOR_PARTY\"]}\n // handlePriorEditOpen(row[\"NRN\"], row[\"NPRIOR_PARTY\"])}>\n // edit \n // \n // >\n // )\n // };\n // case \"NCHANGE_FACEACC\":\n // return {\n // data: (\n // \n // handleOrderEditOpen(row[\"NRN\"], row[\"SPROD_ORDER\"])}>\n // inventory \n // \n // \n // )\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 editOrderNRN: null,\n editOrderValue: 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 {\n pOnlineShowDictionary\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_6__[\"ApplicationС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 const handleOrderEditOpen = (NRN, sProdOrderValue) => {\n setCostRouteLists(pv => ({\n ...pv,\n editOrderNRN: NRN,\n editOrderValue: sProdOrderValue\n }));\n };\n\n //При закрытии изменения заказа\n const handleOrderEditClose = () => {\n setCostRouteLists(pv => ({\n ...pv,\n editOrderNRN: null,\n editOrderValue: null\n }));\n };\n\n //Изменение заказа\n const setEditOrderValue = value => {\n setCostRouteLists(pv => ({\n ...pv,\n editOrderValue: value\n }));\n };\n\n //При изменении значения заказа\n const handleOrderFormChanged = e => {\n setEditOrderValue(e.target.value);\n };\n\n //При нажатии на изменение заказа\n const handleOrderChange = () => {\n //Изменяем значение\n //priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue);\n //Закрываем окно\n handleOrderEditClose();\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_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_9__[\"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 handleOrderEditOpen\n })\n })))) : null, costRouteLists.editPriorNRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n onClose: () => handlePriorEditClose(null),\n sx: STYLES.DIALOG_EDITOR\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_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"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_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"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_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => handlePriorEditClose(null)\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : null, costRouteLists.editOrderNRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n open: true,\n onClose: () => handleOrderEditClose(null),\n sx: STYLES.DIALOG_EDITOR\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_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n name: \"editOrderValue\",\n label: \"\\u0417\\u0430\\u043A\\u0430\\u0437\",\n variant: \"standard\",\n fullWidth: true,\n value: costRouteLists.editOrderValue,\n onChange: handleOrderFormChanged\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(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.DIALOG_BUTTONS,\n variant: \"contained\",\n onClick: () => {\n pOnlineShowDictionary({\n unitCode: \"FaceAccounts\",\n inputParameters: [{\n name: \"in_NUMB\",\n value: costRouteLists.editOrderValue\n }],\n callBack: res => res.success === true ? setEditOrderValue(res.outParameters.out_NUMB) : null\n });\n }\n }, \"\\u041B\\u0438\\u0446\\u0435\\u0432\\u044B\\u0435 \\u0441\\u0447\\u0435\\u0442\\u0430\"), /*#__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_13__[\"default\"], {\n sx: STYLES.DIALOG_BUTTONS,\n onClick: handleOrderChange,\n variant: \"contained\"\n }, \"\\u0418\\u0437\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C\"))))), /*#__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_13__[\"default\"], {\n onClick: () => handleOrderEditClose(null)\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : null);\n};\n\n//Контроль свойств - Таблица маршрутных листов\nCostRouteListsDataGrid.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_15___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_10__[\"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_11__[\"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_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"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_15___default().number).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_15___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/fcroutlstord.js":
+/*!******************************************************************!*\
+ !*** ./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.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 */ CostRouteListsOrdDataGrid: () => (/* binding */ CostRouteListsOrdDataGrid)\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 CostRouteListsOrdDataGrid = ({\n mainRowRN\n}) => {\n //Собственное состояние - таблица данных\n const [costRouteListsOrd, setCostRouteListsOrd] = (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 (costRouteListsOrd.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLSTORD_DEPT_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(costRouteListsOrd.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteListsOrd.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costRouteListsOrd.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteListsOrd(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 }, [costRouteListsOrd.reload, costRouteListsOrd.filters, costRouteListsOrd.orders, costRouteListsOrd.dataLoaded, costRouteListsOrd.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costRouteListsOrd.reload, loadData]);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setCostRouteListsOrd(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setCostRouteListsOrd(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 }, \"\\u0417\\u0430\\u043A\\u0430\\u0437\\u044B\"), costRouteListsOrd.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: costRouteListsOrd.columnsDef,\n rows: costRouteListsOrd.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: costRouteListsOrd.morePages,\n reloading: costRouteListsOrd.reload,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Таблица заказов маршрутного листа\nCostRouteListsOrdDataGrid.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/fcroutlstord.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 });\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 +4151,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 +4162,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 +4173,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 +4184,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 +4206,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 +4217,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 +4261,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 +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 */ 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 +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 */ 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 +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 */ 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?");
/***/ }),
@@ -3843,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 */ 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 +4415,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..a2a6abe 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"/>
+
+
+
+