diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 813afdc..478c709 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -4569,7 +4569,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 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 TITLE_HEIGHT = \"44px\";\n\n//Высота панели масштабирования\nconst ZOOM_HEIGHT = \"56px\";\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 GANTT_TITLE: {\n height: TITLE_HEIGHT\n },\n GANTT_ZOOM: {\n height: ZOOM_HEIGHT\n },\n GANTT: (noData, title, zoomBar) => ({\n height: `calc(100% - ${zoomBar ? ZOOM_HEIGHT : \"0px\"} - ${title ? TITLE_HEIGHT : \"0px\"})`,\n display: noData ? \"none\" : \"\"\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 containerStyle,\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\", {\n style: {\n ...(containerStyle ? containerStyle : {})\n }\n }, 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 ...STYLES.GANTT_TITLE,\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 sx: STYLES.GANTT_ZOOM\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: STYLES.GANTT(state.noData, title, zoomBar)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n containerStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\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 TITLE_HEIGHT = \"44px\";\n\n//Высота панели масштабирования\nconst ZOOM_HEIGHT = \"56px\";\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 GANTT_TITLE: {\n height: TITLE_HEIGHT\n },\n GANTT_ZOOM: {\n height: ZOOM_HEIGHT\n },\n GANTT: (noData, title, zoomBar) => ({\n height: `calc(100% - ${zoomBar ? ZOOM_HEIGHT : \"0px\"} - ${title ? TITLE_HEIGHT : \"0px\"})`,\n display: noData ? \"none\" : \"\"\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 containerStyle,\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 //Ссылки на DOM\n const svgContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\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 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n svgContainerRef.current.children[0].classList.add(\"scroll\");\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...(containerStyle ? containerStyle : {})\n }\n }, 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 ...STYLES.GANTT_TITLE,\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 sx: STYLES.GANTT_ZOOM\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: STYLES.GANTT(state.noData, title, zoomBar),\n ref: svgContainerRef\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n containerStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\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?"); /***/ }), @@ -5295,7 +5295,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() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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?"); +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_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 _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.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 _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_graph/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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 DATA_GRID_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_1__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_2__.APP_STYLES.SCROLL\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_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"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(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true\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 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_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.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_3__.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_7__.dataCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.groupCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n containerComponentProps: {\n elevation: 0,\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?"); /***/ }), @@ -5383,7 +5383,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_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_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.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/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __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 _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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 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 top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n left: \"16px\"\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: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n paddingTop: \"24px\"\n },\n GANTT_TITLE: {\n paddingLeft: \"150px\",\n paddingRight: \"150px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n right: \"16px\"\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_11__[\"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_12__[\"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_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"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_14__[\"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_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"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_8__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_8__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitPrmsDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_17___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_17___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_17___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_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\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_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"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_17___default().instanceOf(Date),\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_17___default().instanceOf(Date),\n durationMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().string),\n labMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().string),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_17___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_18__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"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_21__[\"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_17___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_18__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"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_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"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_20__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"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_24__[\"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_17___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_17___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_17___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_25__[\"default\"], null, 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_26__[\"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_21__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"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_28__[\"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_28__[\"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_26__[\"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_21__[\"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_27__[\"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_9__.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_29__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_6__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n containerStyle: STYLES.GANTT_CONTAINER,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_10__.taskAttributeRenderer\n })) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n pt: 3\n }, /*#__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_18__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.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/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.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 _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 _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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\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 top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n left: \"16px\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n paddingTop: \"24px\"\n },\n GANTT_TITLE: {\n paddingLeft: \"150px\",\n paddingRight: \"150px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n right: \"16px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\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_12__[\"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_13__[\"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_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"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_15__[\"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_16__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"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_9__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_9__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitPrmsDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_18___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_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"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_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"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_18___default().instanceOf(Date),\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date),\n durationMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string),\n labMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___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_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"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_22__[\"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_18___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_19__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"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_24__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"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_21__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"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_25__[\"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_18___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___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_26__[\"default\"], null, 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_27__[\"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_22__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"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_29__[\"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_29__[\"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_27__[\"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_22__[\"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_28__[\"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_10__.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_30__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_8__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n containerStyle: STYLES.GANTT_CONTAINER,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_11__.taskAttributeRenderer\n })) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n pt: 3\n }, /*#__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?"); /***/ }), @@ -5394,7 +5394,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 */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_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 _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 _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_fact_rpt_dtl */ \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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 ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (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 loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(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 }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на фактическую трудоёмкость по отчетам\n const handleLabFactRptClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayFactRptDtl: sender.NRN,\n titleFactRptDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_FACT_RPT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_9__.periodsDataCellRender)({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabFactRptClick: handleLabFactRptClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_6__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayFactRptDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_7__.LabFactRptDtl, {\n periodId: state.displayFactRptDtl,\n title: state.titleFactRptDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_8__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n onPlanJobsDtlProjectClick: (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/prj_jobs/res_mon.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _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_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lab_fact_rpt_dtl */ \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, 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//Стили\nconst STYLES = {\n DATA_GRID_CONTAINER: morePages => ({\n height: `calc(100vh - ${morePages ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_MORE_HEIGHT : \"0px\"})`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (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_3__[\"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_2__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(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 }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на фактическую трудоёмкость по отчетам\n const handleLabFactRptClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayFactRptDtl: sender.NRN,\n titleFactRptDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_FACT_RPT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__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 containerComponentProps: {\n elevation: 0,\n sx: STYLES.DATA_GRID_CONTAINER(peridos.morePages)\n },\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n fixedHeader: true,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.periodsDataCellRender)({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabFactRptClick: handleLabFactRptClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_7__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayFactRptDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_8__.LabFactRptDtl, {\n periodId: state.displayFactRptDtl,\n title: state.titleFactRptDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_9__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); /***/ }),