diff --git a/dist/p8-panels.js b/dist/p8-panels.js index c50afce..e6f2245 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -3260,7 +3260,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML),\n/* harmony export */ xml2JSON: () => (/* binding */ xml2JSON)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Конвертация XML в JSON\nconst xml2JSON = ({\n xmlDoc,\n attributeValueProcessor,\n isArray\n}) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n if (isArray) opts.isArray = isArray;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); /***/ }), @@ -3348,7 +3348,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__);\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = xmlDoc => {\n return new Promise((resolve, reject) => {\n try {\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_8__.XMLParser({\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\",\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val\n });\n const data = parser.parse(xmlDoc);\n resolve(data.XDATA);\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Список планов\nconst PlansList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n minWidth: \"250px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n minWidth: \"250px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_6__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Список планов\nconst PlansList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(event.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список планов\nPlansList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n plans: [],\n plansLoaded: false,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanGanttDef: {},\n selectedPlanSpecs: []\n });\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n const filteredPlans = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useFilteredPlans)(state.plans, filter);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n // Инициализация планов\n const initPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.PRODPLAN_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n plans: [...(data?.XFCPRODPLANS || [])],\n plansLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор плана\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlan: project,\n selectedPlanSpecsLoaded: false,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanSpecsLoaded: false,\n selectedPlan: null,\n selectedPlanMaxLevel: null,\n selectedPlanLevel: null,\n selectedPlanMenuItems: null,\n selectedPlanSpecs: [],\n selectedPlanGanttDef: {},\n showPlanList: false\n }));\n\n //Загрузка списка спецификаций плана\n const loadPlanSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan,\n NLEVEL: level\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanMaxLevel: data.NMAX_LEVEL,\n selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanMenuItems: state.selectedPlanMenuItems ? state.selectedPlanMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanSpecsLoaded: true,\n selectedPlanGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlan]);\n\n //Обработка нажатия на элемент в списке планов\n const handleProjectClick = project => {\n if (state.selectedPlan != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //Отработка нажатия на заголовок плана\n const handleTitleClick = () => {\n state.selectedPlan ? pOnlineShowDocument({\n unitCode: \"CostProductPlans\",\n document: state.selectedPlan\n }) : null;\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlans();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan) loadPlanSpecs();\n }, [state.selectedPlan, loadPlanSpecs]);\n\n //Выбор уровня\n const handleChangeSelectList = selectedLevel => {\n loadPlanSpecs(selectedLevel);\n setState(pv => ({\n ...pv,\n selectedPlanLevel: selectedLevel\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlansList, {\n plans: filteredPlans,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n })), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanSpecsLoaded ? state.selectedPlanSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, state.selectedPlanMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n float: \"right\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n id: \"demo-simple-select-label\"\n }, \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n labelId: \"demo-simple-select-label\",\n id: \"demo-simple-select\",\n value: state.selectedPlanLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectList(event.target.value);\n },\n defaultValue: state.selectedPlanLevel\n }, state.selectedPlanMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n value: el,\n key: el\n }, el)))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_5__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanGanttDef, {\n height: GANTT_HEIGHT,\n onTitleClick: handleTitleClick,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanSpecs\n }))) : !state.selectedPlan ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения его спецификации\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), @@ -3524,7 +3524,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"650px\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Монитор ресурсов\n\n//---------\n//Константы\n//---------\n\n//Высота диаграммы Ганта\nconst GANTT_HEIGHT = \"75vh\";\n\n//Ширина диаграммы Ганта\nconst GANTT_WIDTH = \"98vw\";\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_SAVE_BUTTON: {\n backgroundColor: \"orange\"\n },\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: GANTT_HEIGHT,\n width: GANTT_WIDTH\n },\n GANTT_TITLE: {\n paddingLeft: \"100px\",\n paddingRight: \"120px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n right: \"20px\"\n },\n PERIODS_DRAWER: {\n width: \"1000px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1000px\",\n boxSizing: \"border-box\"\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Формирование значения для колонки \"Состояние\" работы\nconst formatJobStatusValue = value => {\n const [text, icon] = value == 0 ? [\"Не начата\", \"not_started\"] : value == 1 ? [\"Выполняется\", \"loop\"] : value == 2 ? [\"Выполнена\", \"task_alt\"] : value == 3 ? [\"Остановлена\", \"do_not_disturb_on\"] : [\"Отменена\", \"cancel\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n labMeas: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: []\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo, dateBegin, dateFact, durationMeas) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo,\n DBEGIN: dateBegin,\n DFACT: dateFact,\n NDURATION_MEAS: durationMeas\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null,\n DFACT: state.dateFact ? new Date(state.dateFact) : null,\n NDURATION_MEAS: state.durationMeas,\n SLAB_MEAS: state.labMeas,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n dateBegin: data.DBEGIN,\n dateFact: data.DFACT,\n durationMeas: data.NDURATION_MEAS,\n labMeas: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.durationMeas, state.labMeas, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas);\n };\n\n //Генерация кастомных представлений атрибутов задачи в редакторе\n const taskAttributeRenderer = ({\n task,\n attribute\n }) => {\n switch (attribute.name) {\n case \"type\":\n return task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n case \"state\":\n return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name]);\n default:\n return null;\n }\n };\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_SAVE_BUTTON,\n onClick: handleSaveToProjectsClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, \"save\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\n secondary: \"\\u041F\\u0435\\u0440\\u0435\\u043D\\u0441\\u0442\\u0438 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0432 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\"\n }))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_7__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.GANTT_CONTAINER,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n height: GANTT_HEIGHT,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer\n }))) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n }) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }),