diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 9ba91d2..6bffbdb 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -4767,7 +4767,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./filter */ \"./app/panels/eqs_prfrm/filter.js\");\n/* harmony import */ var _filter_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./filter_dialog */ \"./app/panels/eqs_prfrm/filter_dialog.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./hooks */ \"./app/panels/eqs_prfrm/hooks.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 pxOuterMenuH = 53;\n//Высота заголовка панели (пиксели)\nconst pxPanelHeaderH = 64;\n//Минимальная ширина таблицы (пиксели)\nconst minGridW = 800;\n//Минимальная высота таблицы (пиксели)\nconst minGridH = 200;\n\n//Стили\nconst STYLES = {\n BOX_ROW: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n GRID_PADDING: {\n paddingTop: 1,\n paddingBottom: 1\n },\n GRID_SIZES: (width, height) => ({\n padding: \"0px\",\n minWidth: minGridW,\n maxWidth: width * 0.975 > minGridW ? width * 0.975 : minGridW,\n minHeight: minGridH,\n maxHeight: (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 > minGridH ? (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 : minGridH\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n fixedHeader: false,\n fixedColumns: 0,\n reload: false\n });\n\n //Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n isOpen: false,\n isDefault: false,\n isSetByUser: false,\n needSave: false,\n values: {\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n }\n });\n\n //Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n\n //Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ,\n SRESPDEP: filter.values.respDep,\n NFROMMONTH: filter.values.fromMonth,\n NFROMYEAR: filter.values.fromYear,\n NTOMONTH: filter.values.toMonth,\n NTOYEAR: filter.values.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //Загрузка значений фильтра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n values: {\n ...pv.values,\n belong: data.JURPERS,\n fromMonth: 1,\n fromYear: data.YEAR,\n toMonth: 12,\n toYear: data.YEAR\n },\n isDefault: true\n }));\n }, [executeStored]);\n\n //Загрузка значений фильтра из локального хранилища браузера\n const loadLocalFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n let vs = filter.values;\n Object.keys(vs).map(function (k) {\n vs[k] = k == \"fromMonth\" || k == \"fromYear\" || k == \"toMonth\" || k == \"toYear\" ? Number(localStorage.getItem(k)) : localStorage.getItem(k);\n });\n setFilter(pv => ({\n ...pv,\n isDefault: true,\n values: {\n ...vs\n }\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ ? filter.values.techServ : null,\n SRESPDEP: filter.values.respDep ? filter.values.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n //Показать/скрыть фильтр\n const setFilterOpen = isOpen => setFilter(pv => ({\n ...pv,\n isOpen\n }));\n\n //Установить значение фильтра\n const setFilterValues = values => setFilter(pv => ({\n ...pv,\n isSetByUser: true,\n needSave: true,\n values: {\n ...values\n }\n }));\n\n //Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n //При изменении фильтра\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isSetByUser) setDataGrid({\n reload: true\n });\n }, [filter.isSetByUser, filter.values.belong, filter.values.prodObj, filter.values.techServ, filter.values.respDep, filter.values.fromMonth, filter.values.fromYear, filter.values.toMonth, filter.values.toYear]);\n\n //При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n //eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n\n //При закрытии панели\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n filter.needSave ? window.addEventListener(\"beforeunload\", function () {\n Object.keys(filter.values).map(function (k) {\n localStorage.setItem(k, filter.values[k]);\n });\n }) : null;\n }, [filter.needSave, filter.values]);\n\n //При загрузке фильтра по умолчанию\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isDefault) setFilterOpen(true);\n }, [filter.isDefault]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n localStorage.getItem(\"belong\") ? loadLocalFilter() : loadDefaultFilter();\n }, [loadDefaultFilter, loadLocalFilter]);\n\n //При открытии диалога фильтра\n const handleFilterClick = () => setFilterOpen(true);\n\n //При изменении фильтра в диалоге\n const handleFilterOk = filter => {\n setFilterValues(filter);\n setFilterOpen(false);\n };\n\n //При закрытии диалога фильтра\n const handleFilterCancel = () => setFilterOpen(false);\n\n //Состояние ширины и высоты рабочей области окна\n const [width, height] = (0,_hooks__WEBPACK_IMPORTED_MODULE_10__.useWindowResize)();\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, filter.isOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter_dialog__WEBPACK_IMPORTED_MODULE_9__.FilterDialog, {\n initial: filter.values,\n onOk: handleFilterOk,\n onCancel: handleFilterCancel\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter__WEBPACK_IMPORTED_MODULE_8__.Filter, {\n filter: filter.values,\n onClick: handleFilterClick\n }), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: {\n ...STYLES.GRID_PADDING,\n ...STYLES.BOX_ROW\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n style: {\n ...STYLES.GRID_SIZES(width, height)\n }\n },\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, width * 0.2, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n }))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __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_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./filter */ \"./app/panels/eqs_prfrm/filter.js\");\n/* harmony import */ var _filter_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./filter_dialog */ \"./app/panels/eqs_prfrm/filter_dialog.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./hooks */ \"./app/panels/eqs_prfrm/hooks.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 pxOuterMenuH = 53;\n//Высота заголовка панели (пиксели)\nconst pxPanelHeaderH = 64;\n//Минимальная ширина таблицы (пиксели)\nconst minGridW = 800;\n//Минимальная высота таблицы (пиксели)\nconst minGridH = 200;\n\n//Стили\nconst STYLES = {\n BOX_ROW: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n GRID_PADDING: {\n paddingTop: 1,\n paddingBottom: 1\n },\n GRID_SIZES: (width, height) => ({\n padding: \"0px\",\n minWidth: minGridW,\n maxWidth: width * 0.975 > minGridW ? width * 0.975 : minGridW,\n minHeight: minGridH,\n maxHeight: (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 > minGridH ? (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 : minGridH\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n fixedHeader: false,\n fixedColumns: 0,\n reload: false\n });\n\n //Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n isOpen: false,\n isDefault: false,\n isSetByUser: false,\n needSave: false,\n values: {\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n }\n });\n\n //Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n\n //Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ,\n SRESPDEP: filter.values.respDep,\n NFROMMONTH: filter.values.fromMonth,\n NFROMYEAR: filter.values.fromYear,\n NTOMONTH: filter.values.toMonth,\n NTOYEAR: filter.values.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //Загрузка значений фильтра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n values: {\n ...pv.values,\n belong: data.JURPERS,\n fromMonth: 1,\n fromYear: data.YEAR,\n toMonth: 12,\n toYear: data.YEAR\n },\n isDefault: true\n }));\n }, [executeStored]);\n\n //Загрузка значений фильтра из локального хранилища браузера\n const loadLocalFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n let vs = filter.values;\n Object.keys(vs).map(function (k) {\n vs[k] = k == \"fromMonth\" || k == \"fromYear\" || k == \"toMonth\" || k == \"toYear\" ? Number(localStorage.getItem(k)) : localStorage.getItem(k);\n });\n setFilter(pv => ({\n ...pv,\n isDefault: true,\n values: {\n ...vs\n }\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ ? filter.values.techServ : null,\n SRESPDEP: filter.values.respDep ? filter.values.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n //Показать/скрыть фильтр\n const setFilterOpen = isOpen => setFilter(pv => ({\n ...pv,\n isOpen\n }));\n\n //Установить значение фильтра\n const setFilterValues = values => setFilter(pv => ({\n ...pv,\n isSetByUser: true,\n needSave: true,\n values: {\n ...values\n }\n }));\n\n //Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n //При изменении фильтра\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isSetByUser) setDataGrid({\n reload: true\n });\n }, [filter.isSetByUser, filter.values.belong, filter.values.prodObj, filter.values.techServ, filter.values.respDep, filter.values.fromMonth, filter.values.fromYear, filter.values.toMonth, filter.values.toYear]);\n\n //При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n //eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n\n //При закрытии панели\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n filter.needSave ? window.addEventListener(\"beforeunload\", function () {\n Object.keys(filter.values).map(function (k) {\n localStorage.setItem(k, filter.values[k]);\n });\n }) : null;\n }, [filter.needSave, filter.values]);\n\n //При загрузке фильтра по умолчанию\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isDefault) setFilterOpen(true);\n }, [filter.isDefault]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n localStorage.getItem(\"belong\") ? loadLocalFilter() : loadDefaultFilter();\n }, [loadDefaultFilter, loadLocalFilter]);\n\n //При открытии диалога фильтра\n const handleFilterClick = () => setFilterOpen(true);\n\n //При изменении фильтра в диалоге\n const handleFilterOk = filter => {\n setFilterValues(filter);\n setFilterOpen(false);\n };\n\n //При закрытии диалога фильтра\n const handleFilterCancel = () => setFilterOpen(false);\n\n //Состояние ширины и высоты рабочей области окна\n const [width, height] = (0,_hooks__WEBPACK_IMPORTED_MODULE_10__.useWindowResize)();\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, filter.isOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter_dialog__WEBPACK_IMPORTED_MODULE_9__.FilterDialog, {\n initial: filter.values,\n onOk: handleFilterOk,\n onCancel: handleFilterCancel\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter__WEBPACK_IMPORTED_MODULE_8__.Filter, {\n filter: filter.values,\n onClick: handleFilterClick\n }), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: {\n ...STYLES.GRID_PADDING,\n ...STYLES.BOX_ROW\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n style: {\n ...STYLES.GRID_SIZES(width, height)\n }\n },\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, width * 0.2, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n }))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); /***/ }),